1788731cdSVlad Serebrennikov // RUN: %clang_cc1 -std=c++98 %s -verify=expected,cxx98-23,cxx98-11,cxx98-14,cxx98-17,cxx98 -fexceptions -fcxx-exceptions -pedantic-errors 2788731cdSVlad Serebrennikov // RUN: %clang_cc1 -std=c++11 %s -verify=expected,cxx98-23,cxx98-11,cxx98-14,cxx98-17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors 3788731cdSVlad Serebrennikov // RUN: %clang_cc1 -std=c++14 %s -verify=expected,cxx98-23,cxx98-14,cxx98-17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors 4788731cdSVlad Serebrennikov // RUN: %clang_cc1 -std=c++17 %s -verify=expected,cxx98-23,since-cxx17,cxx98-17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors 5788731cdSVlad Serebrennikov // RUN: %clang_cc1 -std=c++20 %s -verify=expected,cxx98-23,since-cxx20,since-cxx17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors 6788731cdSVlad Serebrennikov // RUN: %clang_cc1 -std=c++23 %s -verify=expected,cxx98-23,since-cxx23,since-cxx20,since-cxx17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors 7788731cdSVlad Serebrennikov // RUN: %clang_cc1 -std=c++2c %s -verify=expected,since-cxx26,since-cxx23,since-cxx20,since-cxx17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors 8d358b2deSVlad Serebrennikov 9d358b2deSVlad Serebrennikov #if __cplusplus == 199711L 10d358b2deSVlad Serebrennikov #define static_assert(...) __extension__ _Static_assert(__VA_ARGS__) 11d358b2deSVlad Serebrennikov // cxx98-error@-1 {{variadic macros are a C99 feature}} 12d358b2deSVlad Serebrennikov #endif 13d358b2deSVlad Serebrennikov 14d358b2deSVlad Serebrennikov // FIXME: This is included to avoid a diagnostic with no source location 15d358b2deSVlad Serebrennikov // pointing at the implicit operator new. We can't match such a diagnostic 16d358b2deSVlad Serebrennikov // with -verify. 17d358b2deSVlad Serebrennikov __extension__ typedef __SIZE_TYPE__ size_t; 18d358b2deSVlad Serebrennikov void *operator new(size_t); // #cwg5xx-global-operator-new 19d358b2deSVlad Serebrennikov // cxx98-error@-1 {{'operator new' is missing exception specification 'throw(std::bad_alloc)'}} 20eff12650SVlad Serebrennikov #if __cplusplus >= 201703L 21d358b2deSVlad Serebrennikov namespace std { 22d358b2deSVlad Serebrennikov enum class align_val_t : size_t {}; 23463e61a0SVlad Serebrennikov } // namespace std 24d358b2deSVlad Serebrennikov void *operator new(size_t, std::align_val_t); // #cwg5xx-global-operator-new-aligned 25d358b2deSVlad Serebrennikov #endif 26d358b2deSVlad Serebrennikov 27d358b2deSVlad Serebrennikov namespace std { 28d358b2deSVlad Serebrennikov struct type_info; 29463e61a0SVlad Serebrennikov } // namespace std 30d358b2deSVlad Serebrennikov 31d358b2deSVlad Serebrennikov namespace cwg500 { // cwg500: dup 372 32d358b2deSVlad Serebrennikov class D; 33d358b2deSVlad Serebrennikov class A { 34d358b2deSVlad Serebrennikov class B; 35d358b2deSVlad Serebrennikov class C; 36d358b2deSVlad Serebrennikov friend class D; 37d358b2deSVlad Serebrennikov }; 38d358b2deSVlad Serebrennikov class A::B {}; 39d358b2deSVlad Serebrennikov class A::C : public A::B {}; 40d358b2deSVlad Serebrennikov class D : public A::B {}; 41463e61a0SVlad Serebrennikov } // namespace cwg500 42d358b2deSVlad Serebrennikov 43*14ba3f9dSVlad Serebrennikov namespace cwg501 { // cwg501: 2.7 44d358b2deSVlad Serebrennikov struct A { 45d358b2deSVlad Serebrennikov friend void f() {} 46d358b2deSVlad Serebrennikov void g() { 47d358b2deSVlad Serebrennikov void (*p)() = &f; 48d358b2deSVlad Serebrennikov // expected-error@-1 {{use of undeclared identifier 'f'}} 49d358b2deSVlad Serebrennikov } 50d358b2deSVlad Serebrennikov }; 51463e61a0SVlad Serebrennikov } // namespace cwg501 52d358b2deSVlad Serebrennikov 53*14ba3f9dSVlad Serebrennikov namespace cwg502 { // cwg502: 2.7 54d358b2deSVlad Serebrennikov struct Q {}; 55d358b2deSVlad Serebrennikov template<typename T> struct A { 56d358b2deSVlad Serebrennikov enum E { e = 1 }; 57d358b2deSVlad Serebrennikov void q1() { f(e); } 58d358b2deSVlad Serebrennikov void q2() { Q arr[sizeof(E)]; f(arr); } 59d358b2deSVlad Serebrennikov void q3() { Q arr[e]; f(arr); } 60d358b2deSVlad Serebrennikov void sanity() { Q arr[1]; f(arr); } 61d358b2deSVlad Serebrennikov // expected-error@-1 {{use of undeclared identifier 'f'}} 62d358b2deSVlad Serebrennikov }; 63d358b2deSVlad Serebrennikov int f(A<int>::E); 64d358b2deSVlad Serebrennikov template<int N> int f(Q (&)[N]); 65d358b2deSVlad Serebrennikov template struct A<int>; 66463e61a0SVlad Serebrennikov } // namespace cwg502 67d358b2deSVlad Serebrennikov 68*14ba3f9dSVlad Serebrennikov namespace cwg505 { // cwg505: 2.7 69d358b2deSVlad Serebrennikov const char *exts = "\e\(\{\[\%"; 70d358b2deSVlad Serebrennikov // expected-error@-1 {{use of non-standard escape character '\e'}} 71d358b2deSVlad Serebrennikov // expected-error@-2 {{use of non-standard escape character '\('}} 72d358b2deSVlad Serebrennikov // expected-error@-3 {{use of non-standard escape character '\{'}} 73d358b2deSVlad Serebrennikov // expected-error@-4 {{use of non-standard escape character '\['}} 74d358b2deSVlad Serebrennikov // expected-error@-5 {{use of non-standard escape character '\%'}} 75d358b2deSVlad Serebrennikov const char *unknown = "\Q"; 76d358b2deSVlad Serebrennikov // expected-error@-1 {{unknown escape sequence '\Q'}} 77463e61a0SVlad Serebrennikov } // namespace cwg505 78d358b2deSVlad Serebrennikov 79*14ba3f9dSVlad Serebrennikov namespace cwg506 { // cwg506: 2.7 80d358b2deSVlad Serebrennikov struct NonPod { ~NonPod(); }; 81d358b2deSVlad Serebrennikov void f(...); 82d358b2deSVlad Serebrennikov void g(NonPod np) { f(np); } 83d358b2deSVlad Serebrennikov // cxx98-error@-1 {{cannot pass object of non-POD type 'NonPod' through variadic function; call will abort at runtime}} 84d358b2deSVlad Serebrennikov // since-cxx11-error@-2 {{cannot pass object of non-trivial type 'NonPod' through variadic function; call will abort at runtime}} 85463e61a0SVlad Serebrennikov } // namespace cwg506 86d358b2deSVlad Serebrennikov 87d358b2deSVlad Serebrennikov // FIXME: Add tests here once CWG260 is resolved. 88d358b2deSVlad Serebrennikov // cwg507: dup 260 89d358b2deSVlad Serebrennikov 90d358b2deSVlad Serebrennikov // cwg508: na 91d358b2deSVlad Serebrennikov // cwg509: na 92d358b2deSVlad Serebrennikov // cwg510: na 93d358b2deSVlad Serebrennikov 94*14ba3f9dSVlad Serebrennikov namespace cwg512 { // cwg512: 3.0 95d358b2deSVlad Serebrennikov struct A { // #cwg512-A 96d358b2deSVlad Serebrennikov A(int); // #cwg512-A-ctor 97d358b2deSVlad Serebrennikov }; 98d358b2deSVlad Serebrennikov union U { A a; }; 99d358b2deSVlad Serebrennikov // cxx98-error@-1 {{union member 'a' has a non-trivial default constructor}} 100d358b2deSVlad Serebrennikov // cxx98-note@#cwg512-A {{because type 'cwg512::A' has no default constructor}} 101d358b2deSVlad Serebrennikov // cxx98-note@#cwg512-A-ctor {{implicit default constructor suppressed by user-declared constructor}} 102463e61a0SVlad Serebrennikov } // namespace cwg512 103d358b2deSVlad Serebrennikov 104d358b2deSVlad Serebrennikov // cwg513: na 105d358b2deSVlad Serebrennikov 106*14ba3f9dSVlad Serebrennikov namespace cwg514 { // cwg514: 2.7 107d358b2deSVlad Serebrennikov namespace A { extern int x, y; } 108d358b2deSVlad Serebrennikov int A::x = y; 109463e61a0SVlad Serebrennikov } // namespace cwg514 110d358b2deSVlad Serebrennikov 111d358b2deSVlad Serebrennikov namespace cwg515 { // cwg515: sup 1017 112d358b2deSVlad Serebrennikov // FIXME: cwg1017 reverses the wording of cwg515, but the current draft has 113d358b2deSVlad Serebrennikov // cwg515's wording, with a different fix for cwg1017. 114d358b2deSVlad Serebrennikov 115d358b2deSVlad Serebrennikov struct X { int n; }; 116d358b2deSVlad Serebrennikov template<typename T> struct Y : T { 117d358b2deSVlad Serebrennikov int f() { return X::n; } 118d358b2deSVlad Serebrennikov }; 119d358b2deSVlad Serebrennikov int k = Y<X>().f(); 120d358b2deSVlad Serebrennikov 121d358b2deSVlad Serebrennikov struct A { int a; }; 122d358b2deSVlad Serebrennikov struct B { void f() { int k = sizeof(A::a); } }; 123d358b2deSVlad Serebrennikov // cxx98-error@-1 {{invalid use of non-static data member 'a'}} 124463e61a0SVlad Serebrennikov } // namespace cwg515 125d358b2deSVlad Serebrennikov 126d358b2deSVlad Serebrennikov // cwg516: na 127d358b2deSVlad Serebrennikov 128d358b2deSVlad Serebrennikov namespace cwg517 { // cwg517: no 129d358b2deSVlad Serebrennikov // This is NDR, but we should diagnose it anyway. 130d358b2deSVlad Serebrennikov template<typename T> struct S {}; 131d358b2deSVlad Serebrennikov template<typename T> int v = 0; 132d358b2deSVlad Serebrennikov // cxx98-11-error@-1 {{variable templates are a C++14 extension}} 133d358b2deSVlad Serebrennikov 134d358b2deSVlad Serebrennikov template struct S<int*>; 135d358b2deSVlad Serebrennikov template int v<int*>; 136d358b2deSVlad Serebrennikov 137d358b2deSVlad Serebrennikov S<char&> s; 138d358b2deSVlad Serebrennikov int k = v<char&>; 139d358b2deSVlad Serebrennikov 140d358b2deSVlad Serebrennikov // FIXME: These are both ill-formed. 141d358b2deSVlad Serebrennikov template<typename T> struct S<T*> {}; 142d358b2deSVlad Serebrennikov template<typename T> int v<T*> = 0; 143d358b2deSVlad Serebrennikov 144d358b2deSVlad Serebrennikov // FIXME: These are both ill-formed. 145d358b2deSVlad Serebrennikov template<typename T> struct S<T&> {}; 146d358b2deSVlad Serebrennikov template<typename T> int v<T&> = 0; 147463e61a0SVlad Serebrennikov } // namespace cwg517 148d358b2deSVlad Serebrennikov 149*14ba3f9dSVlad Serebrennikov namespace cwg518 { // cwg518: 2.7 c++11 150d358b2deSVlad Serebrennikov enum E { e, }; 151d358b2deSVlad Serebrennikov // cxx98-error@-1 {{commas at the end of enumerator lists are a C++11 extension}} 152463e61a0SVlad Serebrennikov } // namespace cwg518 153d358b2deSVlad Serebrennikov 154d358b2deSVlad Serebrennikov // cwg519 is in cwg519.cpp 155d358b2deSVlad Serebrennikov // cwg520: na 156d358b2deSVlad Serebrennikov 157d358b2deSVlad Serebrennikov // cwg521: no 158d358b2deSVlad Serebrennikov // FIXME: The wording here is broken. It's not reasonable to expect a 159d358b2deSVlad Serebrennikov // diagnostic here. Once the relevant DR gets a number, mark this as a dup. 160d358b2deSVlad Serebrennikov 161*14ba3f9dSVlad Serebrennikov namespace cwg522 { // cwg522: 2.7 162d358b2deSVlad Serebrennikov struct S {}; 163d358b2deSVlad Serebrennikov template<typename T> void b1(volatile T &); 164d358b2deSVlad Serebrennikov template<typename T> void b2(volatile T * const *); 165d358b2deSVlad Serebrennikov template<typename T> void b2(volatile T * const S::*); 166d358b2deSVlad Serebrennikov template<typename T> void b2(volatile T * const S::* const *); 167d358b2deSVlad Serebrennikov template<typename T> void b2a(volatile T *S::* const *); // #cwg522-b2a 168d358b2deSVlad Serebrennikov 169d358b2deSVlad Serebrennikov template<typename T> struct Base {}; 170d358b2deSVlad Serebrennikov struct Derived : Base<int> {}; 171d358b2deSVlad Serebrennikov template<typename T> void b3(Base<T>); 172d358b2deSVlad Serebrennikov template<typename T> void b3(Base<T> *); 173d358b2deSVlad Serebrennikov 174d358b2deSVlad Serebrennikov void test(int n, const int cn, int **p, int *S::*pm) { 175d358b2deSVlad Serebrennikov int *a[3], *S::*am[3]; 176d358b2deSVlad Serebrennikov const Derived cd = Derived(); 177d358b2deSVlad Serebrennikov Derived d[3]; 178d358b2deSVlad Serebrennikov 179d358b2deSVlad Serebrennikov b1(n); 180d358b2deSVlad Serebrennikov b1(cn); 181d358b2deSVlad Serebrennikov b2(p); 182d358b2deSVlad Serebrennikov b2(pm); 183d358b2deSVlad Serebrennikov b2(a); 184d358b2deSVlad Serebrennikov b2(am); 185d358b2deSVlad Serebrennikov b2a(am); 186d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'b2a'}} 18770c1764dSNathan Ridge // expected-note@#cwg522-b2a {{candidate template ignored: deduced type 'volatile int *S::*const *' of 1st parameter does not match adjusted type 'int *S::**' of argument}} 188d358b2deSVlad Serebrennikov b3(d); 189d358b2deSVlad Serebrennikov b3(cd); 190d358b2deSVlad Serebrennikov } 191463e61a0SVlad Serebrennikov } // namespace cwg522 192d358b2deSVlad Serebrennikov 193*14ba3f9dSVlad Serebrennikov namespace cwg524 { // cwg524: 2.7 194d358b2deSVlad Serebrennikov template<typename T> void f(T a, T b) { operator+(a, b); } 195d358b2deSVlad Serebrennikov // expected-error@-1 {{call to function 'operator+' that is neither visible in the template definition nor found by argument-dependent lookup}} 196d358b2deSVlad Serebrennikov // expected-note@#cwg524-f-N-S {{in instantiation of function template specialization 'cwg524::f<cwg524::N::S>' requested here}} 197d358b2deSVlad Serebrennikov // expected-note@#cwg524-operator-plus {{'operator+' should be declared prior to the call site or in namespace 'cwg524::N'}} 198d358b2deSVlad Serebrennikov 199d358b2deSVlad Serebrennikov struct S {}; 200d358b2deSVlad Serebrennikov void operator+(S, S); 201d358b2deSVlad Serebrennikov template void f(S, S); 202d358b2deSVlad Serebrennikov 203d358b2deSVlad Serebrennikov namespace N { struct S {}; } 204d358b2deSVlad Serebrennikov void operator+(N::S, N::S); // #cwg524-operator-plus 205d358b2deSVlad Serebrennikov template void f(N::S, N::S); // #cwg524-f-N-S 206463e61a0SVlad Serebrennikov } // namespace cwg524 207d358b2deSVlad Serebrennikov 208*14ba3f9dSVlad Serebrennikov namespace cwg525 { // cwg525: 2.7 209d358b2deSVlad Serebrennikov namespace before { 210d358b2deSVlad Serebrennikov // Note, the example was correct prior to the change; instantiation is 211d358b2deSVlad Serebrennikov // required for cases like this: 212d358b2deSVlad Serebrennikov template <class T> struct D { operator T*(); }; 213d358b2deSVlad Serebrennikov void g(D<double> ppp) { 214d358b2deSVlad Serebrennikov delete ppp; 215d358b2deSVlad Serebrennikov } 216d358b2deSVlad Serebrennikov } 217d358b2deSVlad Serebrennikov namespace after { 218d358b2deSVlad Serebrennikov template <class T> struct D { typename T::error e; }; 219d358b2deSVlad Serebrennikov // expected-error@-1 {{type 'double' cannot be used prior to '::' because it has no members}} 220d358b2deSVlad Serebrennikov // expected-note@#cwg525-ppp {{in instantiation of template class 'cwg525::after::D<double>' requested here}} 221d358b2deSVlad Serebrennikov void g(D<double> *ppp) { 222d358b2deSVlad Serebrennikov delete ppp; // #cwg525-ppp 223d358b2deSVlad Serebrennikov } 224d358b2deSVlad Serebrennikov } 225463e61a0SVlad Serebrennikov } // namespace cwg525 226d358b2deSVlad Serebrennikov 227*14ba3f9dSVlad Serebrennikov namespace cwg526 { // cwg526: 2.7 228d358b2deSVlad Serebrennikov template<int> struct S {}; 229d358b2deSVlad Serebrennikov template<int N> void f1(S<N> s); 230d358b2deSVlad Serebrennikov template<int N> void f2(S<(N)> s); // #cwg526-f2 231d358b2deSVlad Serebrennikov template<int N> void f3(S<+N> s); // #cwg526-f3 232d358b2deSVlad Serebrennikov template<int N> void g1(int (&)[N]); 233d358b2deSVlad Serebrennikov template<int N> void g2(int (&)[(N)]); // #cwg526-g2 234d358b2deSVlad Serebrennikov template<int N> void g3(int (&)[+N]); // #cwg526-g3 235d358b2deSVlad Serebrennikov 236d358b2deSVlad Serebrennikov void test(int (&a)[3], S<3> s) { 237d358b2deSVlad Serebrennikov f1(s); 238d358b2deSVlad Serebrennikov f2(s); 239d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'f2'}} 240d358b2deSVlad Serebrennikov // expected-note@#cwg526-f2 {{candidate template ignored: couldn't infer template argument 'N'}} 241d358b2deSVlad Serebrennikov f3(s); 242d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'f3'}} 243d358b2deSVlad Serebrennikov // expected-note@#cwg526-f3 {{candidate template ignored: couldn't infer template argument 'N'}} 244d358b2deSVlad Serebrennikov g1(a); 245d358b2deSVlad Serebrennikov g2(a); 246d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'g2'}} 247d358b2deSVlad Serebrennikov // expected-note@#cwg526-g2 {{candidate template ignored: couldn't infer template argument 'N'}} 248d358b2deSVlad Serebrennikov g3(a); 249d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'g3'}} 250d358b2deSVlad Serebrennikov // expected-note@#cwg526-g3 {{candidate template ignored: couldn't infer template argument 'N'}} 251d358b2deSVlad Serebrennikov } 252d358b2deSVlad Serebrennikov 253d358b2deSVlad Serebrennikov template<int N> struct X { 254d358b2deSVlad Serebrennikov typedef int type; 255d358b2deSVlad Serebrennikov X<N>::type v1; 256d358b2deSVlad Serebrennikov X<(N)>::type v2; 257d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name X<(N)>::type; implicit 'typename' is a C++20 extension}} 258d358b2deSVlad Serebrennikov X<+N>::type v3; 259d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name X<+N>::type; implicit 'typename' is a C++20 extension}} 260d358b2deSVlad Serebrennikov }; 261463e61a0SVlad Serebrennikov } // namespace cwg526 262d358b2deSVlad Serebrennikov 263d358b2deSVlad Serebrennikov namespace cwg527 { // cwg527: na 264d358b2deSVlad Serebrennikov // This DR is meaningless. It removes a required diagnostic from the case 265d358b2deSVlad Serebrennikov // where a not-externally-visible object is odr-used but not defined, which 266d358b2deSVlad Serebrennikov // requires a diagnostic for a different reason. 267d358b2deSVlad Serebrennikov extern struct { int x; } a; // FIXME: We should reject this, per cwg389. 268d358b2deSVlad Serebrennikov static struct { int x; } b; 269d358b2deSVlad Serebrennikov extern "C" struct { int x; } c; 270d358b2deSVlad Serebrennikov namespace { extern struct { int x; } d; } 271d358b2deSVlad Serebrennikov typedef struct { int x; } *P; 272d358b2deSVlad Serebrennikov struct E { static P e; }; // FIXME: We should reject this, per cwg389. 273d358b2deSVlad Serebrennikov namespace { struct F { static P f; }; } 274d358b2deSVlad Serebrennikov 275d358b2deSVlad Serebrennikov int ax = a.x, bx = b.x, cx = c.x, dx = d.x, ex = E::e->x, fx = F::f->x; 276463e61a0SVlad Serebrennikov } // namespace cwg527 277d358b2deSVlad Serebrennikov 278d358b2deSVlad Serebrennikov namespace cwg528 { // cwg528: 2.7 279d358b2deSVlad Serebrennikov 280d358b2deSVlad Serebrennikov struct S; // #cwg528-S 281d358b2deSVlad Serebrennikov 282d358b2deSVlad Serebrennikov void f() { 283d358b2deSVlad Serebrennikov typeid(S); 284d358b2deSVlad Serebrennikov // expected-error@-1 {{'typeid' of incomplete type 'S'}} 285d358b2deSVlad Serebrennikov // expected-note@#cwg528-S {{forward declaration of 'cwg528::S'}} 286d358b2deSVlad Serebrennikov } 287d358b2deSVlad Serebrennikov 288d358b2deSVlad Serebrennikov } // namespace cwg528 289d358b2deSVlad Serebrennikov 290*14ba3f9dSVlad Serebrennikov namespace cwg530 { // cwg530: 2.7 291d358b2deSVlad Serebrennikov template<int*> struct S { enum { N = 1 }; }; 292d358b2deSVlad Serebrennikov template<void(*)()> struct T { enum { N = 1 }; }; 293d358b2deSVlad Serebrennikov int n; 294d358b2deSVlad Serebrennikov void f(); 295d358b2deSVlad Serebrennikov int a[S<&n>::N]; 296d358b2deSVlad Serebrennikov int b[T<&f>::N]; 297463e61a0SVlad Serebrennikov } // namespace cwg530 298d358b2deSVlad Serebrennikov 299d358b2deSVlad Serebrennikov namespace cwg531 { // cwg531: partial 300d358b2deSVlad Serebrennikov namespace good { 301d358b2deSVlad Serebrennikov template<typename T> struct A { 302d358b2deSVlad Serebrennikov void f(T) { T::error; } 303d358b2deSVlad Serebrennikov template<typename U> void g(T, U) { T::error; } 304d358b2deSVlad Serebrennikov struct B { typename T::error error; }; 305d358b2deSVlad Serebrennikov template<typename U> struct C { typename T::error error; }; 306d358b2deSVlad Serebrennikov static T n; 307d358b2deSVlad Serebrennikov }; 308d358b2deSVlad Serebrennikov template<typename T> T A<T>::n = T::error; 309d358b2deSVlad Serebrennikov 310d358b2deSVlad Serebrennikov template<> void A<int>::f(int) {} 311d358b2deSVlad Serebrennikov template<> template<typename U> void A<int>::g(int, U) {} 312d358b2deSVlad Serebrennikov template<> struct A<int>::B {}; 313d358b2deSVlad Serebrennikov template<> template<typename U> struct A<int>::C {}; 314d358b2deSVlad Serebrennikov template<> int A<int>::n = 0; 315d358b2deSVlad Serebrennikov 316d358b2deSVlad Serebrennikov void use(A<int> a) { 317d358b2deSVlad Serebrennikov a.f(a.n); 318d358b2deSVlad Serebrennikov a.g(0, 0); 319d358b2deSVlad Serebrennikov A<int>::B b; 320d358b2deSVlad Serebrennikov A<int>::C<int> c; 321d358b2deSVlad Serebrennikov } 322d358b2deSVlad Serebrennikov 323d358b2deSVlad Serebrennikov template<> struct A<char> { 324d358b2deSVlad Serebrennikov void f(char); 325d358b2deSVlad Serebrennikov template<typename U> void g(char, U); 326d358b2deSVlad Serebrennikov struct B; 327d358b2deSVlad Serebrennikov template<typename U> struct C; 328d358b2deSVlad Serebrennikov static char n; 329d358b2deSVlad Serebrennikov }; 330d358b2deSVlad Serebrennikov 331d358b2deSVlad Serebrennikov void A<char>::f(char) {} 332d358b2deSVlad Serebrennikov template<typename U> void A<char>::g(char, U) {} 333d358b2deSVlad Serebrennikov struct A<char>::B {}; 334d358b2deSVlad Serebrennikov template<typename U> struct A<char>::C {}; 335d358b2deSVlad Serebrennikov char A<char>::n = 0; 336d358b2deSVlad Serebrennikov } 337d358b2deSVlad Serebrennikov 338d358b2deSVlad Serebrennikov namespace bad { 339d358b2deSVlad Serebrennikov template<typename T> struct A { 340d358b2deSVlad Serebrennikov void f(T) { T::error; } 341d358b2deSVlad Serebrennikov template<typename U> void g(T, U) { T::error; } 342d358b2deSVlad Serebrennikov struct B { typename T::error error; }; 343d358b2deSVlad Serebrennikov template<typename U> struct C { typename T::error error; }; // #cwg531-C 344d358b2deSVlad Serebrennikov static T n; 345d358b2deSVlad Serebrennikov }; 346d358b2deSVlad Serebrennikov template<typename T> T A<T>::n = T::error; 347d358b2deSVlad Serebrennikov 348d358b2deSVlad Serebrennikov void A<int>::f(int) {} 349d358b2deSVlad Serebrennikov // expected-error@-1 {{template specialization requires 'template<>'}} 350d358b2deSVlad Serebrennikov template<typename U> void A<int>::g(int, U) {} 351d358b2deSVlad Serebrennikov // expected-error@-1 {{template parameter list matching the non-templated nested type 'cwg531::bad::A<int>' should be empty}} 352d358b2deSVlad Serebrennikov struct A<int>::B {}; 353d358b2deSVlad Serebrennikov // expected-error@-1 {{template specialization requires 'template<>'}} 354d358b2deSVlad Serebrennikov template<typename U> struct A<int>::C {}; 355d358b2deSVlad Serebrennikov // expected-error@-1 {{template parameter list matching the non-templated nested type 'cwg531::bad::A<int>' should be empty}} 356d358b2deSVlad Serebrennikov // expected-error@-2 {{redefinition of 'C' as different kind of symbol}} 357d358b2deSVlad Serebrennikov // expected-note@#cwg531-C {{previous definition is here}} 358d358b2deSVlad Serebrennikov int A<int>::n = 0; 359d358b2deSVlad Serebrennikov // expected-error@-1 {{template specialization requires 'template<>'}} 360d358b2deSVlad Serebrennikov 361d358b2deSVlad Serebrennikov template<> struct A<char> { // #cwg531-A-char 362d358b2deSVlad Serebrennikov void f(char); 363d358b2deSVlad Serebrennikov template<typename U> void g(char, U); 364d358b2deSVlad Serebrennikov struct B; // #cwg531-B 365d358b2deSVlad Serebrennikov template<typename U> struct C; 366d358b2deSVlad Serebrennikov static char n; 367d358b2deSVlad Serebrennikov }; 368d358b2deSVlad Serebrennikov 369d358b2deSVlad Serebrennikov template<> void A<char>::f(char) {} 370d358b2deSVlad Serebrennikov // expected-error@-1 {{no function template matches function template specialization 'f'}} 371d358b2deSVlad Serebrennikov template<> template<typename U> void A<char>::g(char, U) {} 372d358b2deSVlad Serebrennikov // expected-error@-1 {{extraneous template parameter list in template specialization}} 373d358b2deSVlad Serebrennikov // expected-note@#cwg531-A-char {{'template<>' header not required for explicitly-specialized class 'cwg531::bad::A<char>' declared here}} 374d358b2deSVlad Serebrennikov template<> struct A<char>::B {}; 375d358b2deSVlad Serebrennikov // expected-error@-1 {{extraneous 'template<>' in declaration of struct 'B'}} 376d358b2deSVlad Serebrennikov // expected-error@-2 {{specialization of member 'cwg531::bad::A<char>::B' does not specialize an instantiated member}} 377d358b2deSVlad Serebrennikov // expected-note@#cwg531-B {{attempt to specialize declaration here}} 378d358b2deSVlad Serebrennikov template<> template<typename U> struct A<char>::C {}; 379d358b2deSVlad Serebrennikov // expected-error@-1 {{extraneous template parameter list in template specialization}} 380d358b2deSVlad Serebrennikov // expected-note@#cwg531-A-char {{'template<>' header not required for explicitly-specialized class 'cwg531::bad::A<char>' declared here}} 381d358b2deSVlad Serebrennikov template<> char A<char>::n = 0; 382d358b2deSVlad Serebrennikov // expected-error@-1 {{extraneous 'template<>' in declaration of variable 'n'}} 383d358b2deSVlad Serebrennikov } 384d358b2deSVlad Serebrennikov 385d358b2deSVlad Serebrennikov namespace nested { 386d358b2deSVlad Serebrennikov template<typename T> struct A { 387d358b2deSVlad Serebrennikov template<typename U> struct B; 388d358b2deSVlad Serebrennikov }; 389d358b2deSVlad Serebrennikov template<> template<typename U> struct A<int>::B { 390d358b2deSVlad Serebrennikov void f(); 391d358b2deSVlad Serebrennikov void g(); 392d358b2deSVlad Serebrennikov template<typename V> void h(); 393d358b2deSVlad Serebrennikov template<typename V> void i(); 394d358b2deSVlad Serebrennikov }; 395d358b2deSVlad Serebrennikov template<> template<typename U> void A<int>::B<U>::f() {} 396d358b2deSVlad Serebrennikov template<typename U> void A<int>::B<U>::g() {} 397d358b2deSVlad Serebrennikov // expected-error@-1 {{template parameter list matching the non-templated nested type 'cwg531::nested::A<int>' should be empty ('template<>')}} 398d358b2deSVlad Serebrennikov 399d358b2deSVlad Serebrennikov template<> template<typename U> template<typename V> void A<int>::B<U>::h() {} 400d358b2deSVlad Serebrennikov template<typename U> template<typename V> void A<int>::B<U>::i() {} 401d358b2deSVlad Serebrennikov // expected-error@-1 {{template parameter list matching the non-templated nested type 'cwg531::nested::A<int>' should be empty ('template<>')}} 402d358b2deSVlad Serebrennikov 403d358b2deSVlad Serebrennikov #if __cplusplus <= 201703L 404d358b2deSVlad Serebrennikov // FIXME: All of those declarations shouldn't crash in C++20 mode. 405d358b2deSVlad Serebrennikov template<> template<> void A<int>::B<int>::f() {} 406d358b2deSVlad Serebrennikov template<> template<> template<typename V> void A<int>::B<int>::h() {} 407d358b2deSVlad Serebrennikov template<> template<> template<> void A<int>::B<int>::h<int>() {} 408d358b2deSVlad Serebrennikov 409d358b2deSVlad Serebrennikov template<> void A<int>::B<char>::f() {} 410d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{template specialization requires 'template<>'}} 411d358b2deSVlad Serebrennikov template<> template<typename V> void A<int>::B<char>::h() {} 412d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{template parameter list matching the non-templated nested type 'cwg531::nested::A<int>::B<char>' should be empty ('template<>')}} 413d358b2deSVlad Serebrennikov #endif 414d358b2deSVlad Serebrennikov } 415463e61a0SVlad Serebrennikov } // namespace cwg531 416d358b2deSVlad Serebrennikov 417d358b2deSVlad Serebrennikov // PR8130 418d358b2deSVlad Serebrennikov namespace cwg532 { // cwg532: 3.5 419d358b2deSVlad Serebrennikov struct A { }; 420d358b2deSVlad Serebrennikov 421d358b2deSVlad Serebrennikov template<class T> struct B { 422d358b2deSVlad Serebrennikov template<class R> int &operator*(R&); 423d358b2deSVlad Serebrennikov }; 424d358b2deSVlad Serebrennikov 425d358b2deSVlad Serebrennikov template<class T, class R> float &operator*(T&, R&); 426d358b2deSVlad Serebrennikov void test() { 427d358b2deSVlad Serebrennikov A a; 428d358b2deSVlad Serebrennikov B<A> b; 429d358b2deSVlad Serebrennikov int &ir = b * a; 430d358b2deSVlad Serebrennikov } 431463e61a0SVlad Serebrennikov } // namespace cwg532 432d358b2deSVlad Serebrennikov 433d358b2deSVlad Serebrennikov // cwg533: na 434d358b2deSVlad Serebrennikov 435d358b2deSVlad Serebrennikov namespace cwg534 { // cwg534: 2.9 436d358b2deSVlad Serebrennikov struct S {}; 437d358b2deSVlad Serebrennikov template<typename T> void operator+(S, T); 438d358b2deSVlad Serebrennikov template<typename T> void operator+<T*>(S, T*) {} 439d358b2deSVlad Serebrennikov // expected-error@-1 {{function template partial specialization is not allowed}} 440463e61a0SVlad Serebrennikov } // namespace cwg534 441d358b2deSVlad Serebrennikov 442*14ba3f9dSVlad Serebrennikov namespace cwg535 { // cwg535: 3.1 443d358b2deSVlad Serebrennikov class X { private: X(const X&); }; 444d358b2deSVlad Serebrennikov struct A { 445d358b2deSVlad Serebrennikov X x; 446d358b2deSVlad Serebrennikov template<typename T> A(T&); 447d358b2deSVlad Serebrennikov }; 448d358b2deSVlad Serebrennikov struct B : A { 449d358b2deSVlad Serebrennikov X y; 450d358b2deSVlad Serebrennikov B(volatile A&); 451d358b2deSVlad Serebrennikov }; 452d358b2deSVlad Serebrennikov 453d358b2deSVlad Serebrennikov extern A a1; 454d358b2deSVlad Serebrennikov A a2(a1); // ok, uses constructor template 455d358b2deSVlad Serebrennikov 456d358b2deSVlad Serebrennikov extern volatile B b1; 457d358b2deSVlad Serebrennikov B b2(b1); // ok, uses converting constructor 458d358b2deSVlad Serebrennikov 459d358b2deSVlad Serebrennikov void f() { throw a1; } 460d358b2deSVlad Serebrennikov 461d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L 462d358b2deSVlad Serebrennikov struct C { 463d358b2deSVlad Serebrennikov constexpr C() : n(0) {} 464d358b2deSVlad Serebrennikov template<typename T> constexpr C(T&t) : n(t.n == 0 ? throw 0 : 0) {} 465d358b2deSVlad Serebrennikov int n; 466d358b2deSVlad Serebrennikov }; 467d358b2deSVlad Serebrennikov constexpr C c() { return C(); } 468d358b2deSVlad Serebrennikov // ok, copy is elided 469d358b2deSVlad Serebrennikov constexpr C x = c(); 470d358b2deSVlad Serebrennikov #endif 471463e61a0SVlad Serebrennikov } // namespace cwg535 472d358b2deSVlad Serebrennikov 473d358b2deSVlad Serebrennikov // cwg536: na 474d358b2deSVlad Serebrennikov // cwg537: na 475d358b2deSVlad Serebrennikov // cwg538: na 476d358b2deSVlad Serebrennikov 477*14ba3f9dSVlad Serebrennikov namespace cwg539 { // cwg539: 3.4 478*14ba3f9dSVlad Serebrennikov const f( 479d358b2deSVlad Serebrennikov // expected-error@-1 {{a type specifier is required for all declarations}} 480d358b2deSVlad Serebrennikov const a) { 481d358b2deSVlad Serebrennikov // expected-error@-1 {{unknown type name 'a'}} 482d358b2deSVlad Serebrennikov const b; 483d358b2deSVlad Serebrennikov // expected-error@-1 {{a type specifier is required for all declarations}} 484d358b2deSVlad Serebrennikov new const; 485d358b2deSVlad Serebrennikov // expected-error@-1 {{expected a type}} 486d358b2deSVlad Serebrennikov try {} catch (const n) {} 487d358b2deSVlad Serebrennikov // expected-error@-1 {{unknown type name 'n'}} 488d358b2deSVlad Serebrennikov try {} catch (const) {} 489d358b2deSVlad Serebrennikov // expected-error@-1 {{expected a type}} 490d358b2deSVlad Serebrennikov if (const n = 0) {} 491d358b2deSVlad Serebrennikov // expected-error@-1 {{a type specifier is required for all declarations}} 492d358b2deSVlad Serebrennikov switch (const n = 0) {} 493d358b2deSVlad Serebrennikov // expected-error@-1 {{a type specifier is required for all declarations}} 494d358b2deSVlad Serebrennikov while (const n = 0) {} 495d358b2deSVlad Serebrennikov // expected-error@-1 {{a type specifier is required for all declarations}} 496d358b2deSVlad Serebrennikov for (const n = 0; 497d358b2deSVlad Serebrennikov // expected-error@-1 {{a type specifier is required for all declarations}} 498d358b2deSVlad Serebrennikov const m = 0; ) {} 499d358b2deSVlad Serebrennikov // expected-error@-1 {{a type specifier is required for all declarations}} 500d358b2deSVlad Serebrennikov sizeof(const); 501d358b2deSVlad Serebrennikov // expected-error@-1 {{a type specifier is required for all declarations}} 502d358b2deSVlad Serebrennikov struct S { 503d358b2deSVlad Serebrennikov const n; 504d358b2deSVlad Serebrennikov // expected-error@-1 {{a type specifier is required for all declarations}} 505d358b2deSVlad Serebrennikov operator const(); 506d358b2deSVlad Serebrennikov // expected-error@-1 {{expected a type}} 507d358b2deSVlad Serebrennikov }; 508d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L 509d358b2deSVlad Serebrennikov int arr[3]; 510d358b2deSVlad Serebrennikov // FIXME: The extra braces here are to avoid the parser getting too 511d358b2deSVlad Serebrennikov // badly confused when recovering here. We should fix this recovery. 512*14ba3f9dSVlad Serebrennikov { for (const n // #cwg539-for 513d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{unknown type name 'n'}} 514d358b2deSVlad Serebrennikov : arr) ; {} } 515d358b2deSVlad Serebrennikov // since-cxx11-error@-1 +{{}} 516*14ba3f9dSVlad Serebrennikov // since-cxx11-note@#cwg539-for {{}} 517d358b2deSVlad Serebrennikov (void) [](const) {}; 518d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{a type specifier is required for all declarations}} 519d358b2deSVlad Serebrennikov (void) [](const n) {}; 520d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{unknown type name 'n'}} 521d358b2deSVlad Serebrennikov enum E : const {}; 522d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{expected a type}} 523d358b2deSVlad Serebrennikov using T = const; 524d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{expected a type}} 525d358b2deSVlad Serebrennikov auto f() -> const; 526d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{expected a type}} 527d358b2deSVlad Serebrennikov #endif 528d358b2deSVlad Serebrennikov } 529*14ba3f9dSVlad Serebrennikov } // namespace cwg539 530d358b2deSVlad Serebrennikov 531*14ba3f9dSVlad Serebrennikov namespace cwg540 { // cwg540: 2.7 532d358b2deSVlad Serebrennikov typedef int &a; 533d358b2deSVlad Serebrennikov typedef const a &a; 534d358b2deSVlad Serebrennikov // expected-warning@-1 {{'const' qualifier on reference type 'a' (aka 'int &') has no effect}} 535d358b2deSVlad Serebrennikov typedef const int &b; 536d358b2deSVlad Serebrennikov typedef b &b; 537d358b2deSVlad Serebrennikov typedef const a &c; // #cwg540-typedef-a-c 538d358b2deSVlad Serebrennikov // expected-warning@-1 {{'const' qualifier on reference type 'a' (aka 'int &') has no effect}} 539d358b2deSVlad Serebrennikov typedef const b &c; // #cwg540-typedef-b-c 540d358b2deSVlad Serebrennikov // expected-error@#cwg540-typedef-b-c {{typedef redefinition with different types ('const int &' vs 'int &')}} 541d358b2deSVlad Serebrennikov // expected-note@#cwg540-typedef-a-c {{previous definition is here}} 542d358b2deSVlad Serebrennikov // expected-warning@#cwg540-typedef-b-c {{'const' qualifier on reference type 'b' (aka 'const int &') has no effect}} 543463e61a0SVlad Serebrennikov } // namespace cwg540 544d358b2deSVlad Serebrennikov 545*14ba3f9dSVlad Serebrennikov namespace cwg541 { // cwg541: 2.7 546d358b2deSVlad Serebrennikov template<int> struct X { typedef int type; }; 547d358b2deSVlad Serebrennikov template<typename T> struct S { 548d358b2deSVlad Serebrennikov int f(T); 549d358b2deSVlad Serebrennikov 550d358b2deSVlad Serebrennikov int g(int); 551d358b2deSVlad Serebrennikov T g(bool); 552d358b2deSVlad Serebrennikov 553d358b2deSVlad Serebrennikov int h(); 554d358b2deSVlad Serebrennikov int h(T); 555d358b2deSVlad Serebrennikov 556d358b2deSVlad Serebrennikov void x() { 557d358b2deSVlad Serebrennikov // These are type-dependent expressions, even though we could 558d358b2deSVlad Serebrennikov // determine that all calls have type 'int'. 559d358b2deSVlad Serebrennikov X<sizeof(f(0))>::type a; 560d358b2deSVlad Serebrennikov // expected-error@-1 {{expected ';' after expression}} 561d358b2deSVlad Serebrennikov // expected-error@-2 {{use of undeclared identifier 'a'}} 562d358b2deSVlad Serebrennikov X<sizeof(g(0))>::type b; 563d358b2deSVlad Serebrennikov // expected-error@-1 {{expected ';' after expression}} 564d358b2deSVlad Serebrennikov // expected-error@-2 {{use of undeclared identifier 'b'}} 565d358b2deSVlad Serebrennikov X<sizeof(h(0))>::type b; 566d358b2deSVlad Serebrennikov // expected-error@-1 {{expected ';' after expression}} 567d358b2deSVlad Serebrennikov // expected-error@-2 {{use of undeclared identifier 'b'}} 568d358b2deSVlad Serebrennikov 569d358b2deSVlad Serebrennikov typename X<sizeof(f(0))>::type a; 570d358b2deSVlad Serebrennikov typename X<sizeof(h(0))>::type b; 571d358b2deSVlad Serebrennikov } 572d358b2deSVlad Serebrennikov }; 573463e61a0SVlad Serebrennikov } // namespace cwg541 574d358b2deSVlad Serebrennikov 575*14ba3f9dSVlad Serebrennikov namespace cwg542 { // cwg542: 3.5 576d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L 577d358b2deSVlad Serebrennikov // In C++20 A and B are no longer aggregates and thus the constructor is 578d358b2deSVlad Serebrennikov // called, which fails. 579d358b2deSVlad Serebrennikov struct A { A() = delete; int n; }; // #cwg542-A 580d358b2deSVlad Serebrennikov // ok, constructor not called 581d358b2deSVlad Serebrennikov A a[32] = {}; // #cwg542-a 582d358b2deSVlad Serebrennikov // since-cxx20-error@-1 {{call to deleted constructor of 'A'}} 583d358b2deSVlad Serebrennikov // since-cxx20-note@#cwg542-A {{'A' has been explicitly marked deleted here}} 584d358b2deSVlad Serebrennikov // since-cxx20-note@#cwg542-a {{in implicit initialization of array element 0 with omitted initializer}} 585d358b2deSVlad Serebrennikov 586d358b2deSVlad Serebrennikov struct B { 587d358b2deSVlad Serebrennikov int n; 588d358b2deSVlad Serebrennikov private: 589d358b2deSVlad Serebrennikov B() = default; // #cwg542-B-ctor 590d358b2deSVlad Serebrennikov }; 591d358b2deSVlad Serebrennikov B b[32] = {}; // ok, constructor not called 592d358b2deSVlad Serebrennikov // since-cxx20-error@-1 {{calling a private constructor of class 'cwg542::B'}} 593d358b2deSVlad Serebrennikov // since-cxx20-note@#cwg542-B-ctor {{declared private here}} 594d358b2deSVlad Serebrennikov #endif 595463e61a0SVlad Serebrennikov } // namespace cwg542 596d358b2deSVlad Serebrennikov 597d358b2deSVlad Serebrennikov namespace cwg543 { // cwg543: 3.0 598d358b2deSVlad Serebrennikov // In C++98+CWG543, this is valid because value-initialization doesn't call a 599d358b2deSVlad Serebrennikov // trivial default constructor, so we never notice that defining the 600d358b2deSVlad Serebrennikov // constructor would be ill-formed. 601d358b2deSVlad Serebrennikov // 602d358b2deSVlad Serebrennikov // In C++11+CWG543, this is ill-formed, because the default constructor is 603d358b2deSVlad Serebrennikov // deleted, and value-initialization *does* call a deleted default 604d358b2deSVlad Serebrennikov // constructor, even if it is trivial. 605d358b2deSVlad Serebrennikov struct A { 606d358b2deSVlad Serebrennikov const int n; // #cwg543-A-n 607d358b2deSVlad Serebrennikov }; 608d358b2deSVlad Serebrennikov A a = A(); 609d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{call to implicitly-deleted default constructor of 'A'}} 610d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg543-A-n {{default constructor of 'A' is implicitly deleted because field 'n' of const-qualified type 'const int' would not be initialized}} 611463e61a0SVlad Serebrennikov } // namespace cwg543 612d358b2deSVlad Serebrennikov 613*14ba3f9dSVlad Serebrennikov namespace cwg544 { // cwg544: 2.7 614d358b2deSVlad Serebrennikov int *n; 615d358b2deSVlad Serebrennikov 616d358b2deSVlad Serebrennikov template<class T> struct A { int n; }; 617d358b2deSVlad Serebrennikov template<class T> struct B : A<T> { int get(); }; 618d358b2deSVlad Serebrennikov template<> int B<int>::get() { return n; } 619d358b2deSVlad Serebrennikov int k = B<int>().get(); 620463e61a0SVlad Serebrennikov } // namespace cwg544 621d358b2deSVlad Serebrennikov 622*14ba3f9dSVlad Serebrennikov namespace cwg546 { // cwg546: 2.7 623d358b2deSVlad Serebrennikov template<typename T> struct A { void f(); }; 624d358b2deSVlad Serebrennikov template struct A<int>; 625d358b2deSVlad Serebrennikov template<typename T> void A<T>::f() { T::error; } 626463e61a0SVlad Serebrennikov } // namespace cwg546 627d358b2deSVlad Serebrennikov 628d358b2deSVlad Serebrennikov namespace cwg547 { // cwg547: 3.2 629d358b2deSVlad Serebrennikov template<typename T> struct X; 630d358b2deSVlad Serebrennikov template<typename T> struct X<T() const> {}; 631d358b2deSVlad Serebrennikov template<typename T, typename C> X<T> f(T C::*) { return X<T>(); } 632d358b2deSVlad Serebrennikov 633d358b2deSVlad Serebrennikov struct S { void f() const; }; 634d358b2deSVlad Serebrennikov X<void() const> x = f(&S::f); 635463e61a0SVlad Serebrennikov } // namespace cwg547 636d358b2deSVlad Serebrennikov 637d358b2deSVlad Serebrennikov namespace cwg548 { // cwg548: dup 482 638d358b2deSVlad Serebrennikov template<typename T> struct S {}; 639d358b2deSVlad Serebrennikov template<typename T> void f() {} 640d358b2deSVlad Serebrennikov template struct cwg548::S<int>; 641d358b2deSVlad Serebrennikov template void cwg548::f<int>(); 642463e61a0SVlad Serebrennikov } // namespace cwg548 643d358b2deSVlad Serebrennikov 644d358b2deSVlad Serebrennikov // cwg550: dup 393 645d358b2deSVlad Serebrennikov 646*14ba3f9dSVlad Serebrennikov namespace cwg551 { // cwg551: 2.7 c++11 647d358b2deSVlad Serebrennikov // FIXME: This obviously should apply in C++98 mode too. 648d358b2deSVlad Serebrennikov template<typename T> void f() {} 649d358b2deSVlad Serebrennikov template inline void f<int>(); 650d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{explicit instantiation cannot be 'inline'}} 651d358b2deSVlad Serebrennikov 652d358b2deSVlad Serebrennikov template<typename T> inline void g() {} 653d358b2deSVlad Serebrennikov template inline void g<int>(); 654d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{explicit instantiation cannot be 'inline'}} 655d358b2deSVlad Serebrennikov 656d358b2deSVlad Serebrennikov template<typename T> struct X { 657d358b2deSVlad Serebrennikov void f() {} 658d358b2deSVlad Serebrennikov }; 659d358b2deSVlad Serebrennikov template inline void X<int>::f(); 660d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{explicit instantiation cannot be 'inline'}} 661463e61a0SVlad Serebrennikov } // namespace cwg551 662d358b2deSVlad Serebrennikov 663*14ba3f9dSVlad Serebrennikov namespace cwg552 { // cwg552: 2.7 664d358b2deSVlad Serebrennikov template<typename T, typename T::U> struct X {}; 665d358b2deSVlad Serebrennikov struct Y { typedef int U; }; 666d358b2deSVlad Serebrennikov X<Y, 0> x; 667463e61a0SVlad Serebrennikov } // namespace cwg552 668d358b2deSVlad Serebrennikov 669d358b2deSVlad Serebrennikov // cwg553: 2.7 670d358b2deSVlad Serebrennikov struct cwg553_class { 671d358b2deSVlad Serebrennikov friend void *operator new(size_t, cwg553_class); 672d358b2deSVlad Serebrennikov }; 673d358b2deSVlad Serebrennikov namespace cwg553 { 674d358b2deSVlad Serebrennikov cwg553_class c; 675d358b2deSVlad Serebrennikov // Contrary to the apparent intention of the DR, operator new is not actually 676d358b2deSVlad Serebrennikov // looked up with a lookup mechanism that performs ADL; the standard says it 677d358b2deSVlad Serebrennikov // "is looked up in global scope", where it is not visible. 678d358b2deSVlad Serebrennikov void *p = new (c) int; 679d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'operator new'}} 680d358b2deSVlad Serebrennikov // since-cxx17-note@#cwg5xx-global-operator-new-aligned {{candidate function not viable: no known conversion from 'cwg553_class' to 'std::align_val_t' for 2nd argument}} 681d358b2deSVlad Serebrennikov // expected-note@#cwg5xx-global-operator-new {{candidate function not viable: requires 1 argument, but 2 were provided}} 682d358b2deSVlad Serebrennikov 683d358b2deSVlad Serebrennikov struct namespace_scope { 684d358b2deSVlad Serebrennikov friend void *operator new(size_t, namespace_scope); 685d358b2deSVlad Serebrennikov // expected-error@-1 {{'operator new' cannot be declared inside a namespace}} 686d358b2deSVlad Serebrennikov }; 687463e61a0SVlad Serebrennikov } // namespace cwg553 688d358b2deSVlad Serebrennikov 689d358b2deSVlad Serebrennikov // cwg554: na 690d358b2deSVlad Serebrennikov 691d358b2deSVlad Serebrennikov namespace cwg555 { // cwg555: 2.8 692d358b2deSVlad Serebrennikov typedef int I; 693d358b2deSVlad Serebrennikov typedef const int CI; 694d358b2deSVlad Serebrennikov typedef volatile int VI; 695d358b2deSVlad Serebrennikov void f(int *a, CI *b, VI *c) { 696d358b2deSVlad Serebrennikov a->~I(); 697d358b2deSVlad Serebrennikov a->~CI(); 698d358b2deSVlad Serebrennikov a->~VI(); 699d358b2deSVlad Serebrennikov a->I::~I(); 700d358b2deSVlad Serebrennikov a->CI::~CI(); 701d358b2deSVlad Serebrennikov a->VI::~VI(); 702d358b2deSVlad Serebrennikov 703d358b2deSVlad Serebrennikov a->CI::~VI(); // allowed by changes to [expr.id.prim.qual]/2 introduced in P1131R2 704d358b2deSVlad Serebrennikov 705d358b2deSVlad Serebrennikov b->~I(); 706d358b2deSVlad Serebrennikov b->~CI(); 707d358b2deSVlad Serebrennikov b->~VI(); 708d358b2deSVlad Serebrennikov b->I::~I(); 709d358b2deSVlad Serebrennikov b->CI::~CI(); 710d358b2deSVlad Serebrennikov b->VI::~VI(); 711d358b2deSVlad Serebrennikov 712d358b2deSVlad Serebrennikov c->~I(); 713d358b2deSVlad Serebrennikov c->~CI(); 714d358b2deSVlad Serebrennikov c->~VI(); 715d358b2deSVlad Serebrennikov c->I::~I(); 716d358b2deSVlad Serebrennikov c->CI::~CI(); 717d358b2deSVlad Serebrennikov c->VI::~VI(); 718d358b2deSVlad Serebrennikov } 719d358b2deSVlad Serebrennikov 720d358b2deSVlad Serebrennikov void g(int &a, CI &b, VI &c) { 721d358b2deSVlad Serebrennikov a.~I(); 722d358b2deSVlad Serebrennikov a.~CI(); 723d358b2deSVlad Serebrennikov a.~VI(); 724d358b2deSVlad Serebrennikov a.I::~I(); 725d358b2deSVlad Serebrennikov a.CI::~CI(); 726d358b2deSVlad Serebrennikov a.VI::~VI(); 727d358b2deSVlad Serebrennikov 728d358b2deSVlad Serebrennikov a.CI::~VI(); // allowed by changes to [expr.id.prim.qual]/2 introduced in P1131R2 729d358b2deSVlad Serebrennikov 730d358b2deSVlad Serebrennikov b.~I(); 731d358b2deSVlad Serebrennikov b.~CI(); 732d358b2deSVlad Serebrennikov b.~VI(); 733d358b2deSVlad Serebrennikov b.I::~I(); 734d358b2deSVlad Serebrennikov b.CI::~CI(); 735d358b2deSVlad Serebrennikov b.VI::~VI(); 736d358b2deSVlad Serebrennikov 737d358b2deSVlad Serebrennikov c.~I(); 738d358b2deSVlad Serebrennikov c.~CI(); 739d358b2deSVlad Serebrennikov c.~VI(); 740d358b2deSVlad Serebrennikov c.I::~I(); 741d358b2deSVlad Serebrennikov c.CI::~CI(); 742d358b2deSVlad Serebrennikov c.VI::~VI(); 743d358b2deSVlad Serebrennikov } 744d358b2deSVlad Serebrennikov } // namespace cwg555 745d358b2deSVlad Serebrennikov 746d358b2deSVlad Serebrennikov // cwg556: na 747d358b2deSVlad Serebrennikov 748d358b2deSVlad Serebrennikov namespace cwg557 { // cwg557: 3.1 749d358b2deSVlad Serebrennikov template<typename T> struct S { 750d358b2deSVlad Serebrennikov friend void f(S<T> *); 751d358b2deSVlad Serebrennikov friend void g(S<S<T> > *); 752d358b2deSVlad Serebrennikov }; 753d358b2deSVlad Serebrennikov void x(S<int> *p, S<S<int> > *q) { 754d358b2deSVlad Serebrennikov f(p); 755d358b2deSVlad Serebrennikov g(q); 756d358b2deSVlad Serebrennikov } 757463e61a0SVlad Serebrennikov } // namespace cwg557 758d358b2deSVlad Serebrennikov 759d358b2deSVlad Serebrennikov namespace cwg558 { // cwg558: 2.9 760d358b2deSVlad Serebrennikov wchar_t a = L'\uD7FF'; 761d358b2deSVlad Serebrennikov wchar_t b = L'\xD7FF'; 762d358b2deSVlad Serebrennikov wchar_t c = L'\uD800'; 763d358b2deSVlad Serebrennikov // expected-error@-1 {{invalid universal character}} 764d358b2deSVlad Serebrennikov wchar_t d = L'\xD800'; 765d358b2deSVlad Serebrennikov wchar_t e = L'\uDFFF'; 766d358b2deSVlad Serebrennikov // expected-error@-1 {{invalid universal character}} 767d358b2deSVlad Serebrennikov wchar_t f = L'\xDFFF'; 768d358b2deSVlad Serebrennikov wchar_t g = L'\uE000'; 769d358b2deSVlad Serebrennikov wchar_t h = L'\xE000'; 770463e61a0SVlad Serebrennikov } // namespace cwg558 771d358b2deSVlad Serebrennikov 772*14ba3f9dSVlad Serebrennikov namespace cwg559 { // cwg559: 2.7 773*14ba3f9dSVlad Serebrennikov template<typename> struct S { typedef int T; S::T u; }; 774*14ba3f9dSVlad Serebrennikov } // namespace cwg559 775d358b2deSVlad Serebrennikov 776d358b2deSVlad Serebrennikov namespace cwg560 { // cwg560: 16 777d358b2deSVlad Serebrennikov 778d358b2deSVlad Serebrennikov template <class T> 779d358b2deSVlad Serebrennikov struct Outer { 780d358b2deSVlad Serebrennikov struct Inner { 781d358b2deSVlad Serebrennikov Inner* self(); 782d358b2deSVlad Serebrennikov }; 783d358b2deSVlad Serebrennikov }; 784d358b2deSVlad Serebrennikov template <class T> 785d358b2deSVlad Serebrennikov Outer<T>::Inner* Outer<T>::Inner::self() { return this; } 786d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name Outer<T>::Inner; implicit 'typename' is a C++20 extension}} 787d358b2deSVlad Serebrennikov 788d358b2deSVlad Serebrennikov } // namespace cwg560 789d358b2deSVlad Serebrennikov 790*14ba3f9dSVlad Serebrennikov namespace cwg561 { // cwg561: 2.7 791d358b2deSVlad Serebrennikov template<typename T> void f(int); 792d358b2deSVlad Serebrennikov template<typename T> void g(T t) { 793d358b2deSVlad Serebrennikov f<T>(t); 794d358b2deSVlad Serebrennikov } 795d358b2deSVlad Serebrennikov namespace { 796d358b2deSVlad Serebrennikov struct S {}; 797d358b2deSVlad Serebrennikov template<typename T> static void f(S); 798d358b2deSVlad Serebrennikov } 799d358b2deSVlad Serebrennikov void h(S s) { 800d358b2deSVlad Serebrennikov g(s); 801d358b2deSVlad Serebrennikov } 802463e61a0SVlad Serebrennikov } // namespace cwg561 803d358b2deSVlad Serebrennikov 804d358b2deSVlad Serebrennikov // cwg562: na 80599f02a87SVlad Serebrennikov // cwg563 is in cwg563.cpp 806d358b2deSVlad Serebrennikov 807*14ba3f9dSVlad Serebrennikov namespace cwg564 { // cwg564: 2.7 808d358b2deSVlad Serebrennikov extern "C++" void f(int); 809d358b2deSVlad Serebrennikov void f(int); // ok 810d358b2deSVlad Serebrennikov extern "C++" { extern int n; } 811d358b2deSVlad Serebrennikov int n; // ok 812463e61a0SVlad Serebrennikov } // namespace cwg564 813d358b2deSVlad Serebrennikov 814*14ba3f9dSVlad Serebrennikov namespace cwg565 { // cwg565: 2.7 815d358b2deSVlad Serebrennikov namespace N { 816d358b2deSVlad Serebrennikov template<typename T> int f(T); // #cwg565-f 817d358b2deSVlad Serebrennikov } 818d358b2deSVlad Serebrennikov using N::f; // #cwg565-using 819d358b2deSVlad Serebrennikov template<typename T> int f(T*); 820d358b2deSVlad Serebrennikov template<typename T> void f(T); 821d358b2deSVlad Serebrennikov template<typename T, int = 0> int f(T); 822d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 823d358b2deSVlad Serebrennikov template<typename T> int f(T, int = 0); 824d358b2deSVlad Serebrennikov template<typename T> int f(T); 825d358b2deSVlad Serebrennikov // expected-error@-1 {{declaration conflicts with target of using declaration already in scope}} 826d358b2deSVlad Serebrennikov // expected-note@#cwg565-f {{target of using declaration}} 827d358b2deSVlad Serebrennikov // expected-note@#cwg565-using {{using declaration}} 828463e61a0SVlad Serebrennikov } // namespace cwg565 829d358b2deSVlad Serebrennikov 830*14ba3f9dSVlad Serebrennikov namespace cwg566 { // cwg566: 3.1 831d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L 832d358b2deSVlad Serebrennikov static_assert(int(-3.99) == -3, ""); 833d358b2deSVlad Serebrennikov #endif 834463e61a0SVlad Serebrennikov } // namespace cwg566 835d358b2deSVlad Serebrennikov 836d358b2deSVlad Serebrennikov // cwg567: na 837d358b2deSVlad Serebrennikov 838d358b2deSVlad Serebrennikov namespace cwg568 { // cwg568: 3.0 c++11 839d358b2deSVlad Serebrennikov // FIXME: This is a DR issue against C++98, so should probably apply there 840d358b2deSVlad Serebrennikov // too. 841d358b2deSVlad Serebrennikov struct x { int y; }; 842d358b2deSVlad Serebrennikov class trivial : x { 843d358b2deSVlad Serebrennikov x y; 844d358b2deSVlad Serebrennikov public: 845d358b2deSVlad Serebrennikov int n; 846d358b2deSVlad Serebrennikov }; 847d358b2deSVlad Serebrennikov static_assert(__is_trivial(trivial), ""); 848d358b2deSVlad Serebrennikov 849d358b2deSVlad Serebrennikov struct std_layout { 850d358b2deSVlad Serebrennikov std_layout(); 851d358b2deSVlad Serebrennikov std_layout(const std_layout &); 852d358b2deSVlad Serebrennikov ~std_layout(); 853d358b2deSVlad Serebrennikov private: 854d358b2deSVlad Serebrennikov int n; 855d358b2deSVlad Serebrennikov }; 856d358b2deSVlad Serebrennikov static_assert(__is_standard_layout(std_layout), ""); 857d358b2deSVlad Serebrennikov 858d358b2deSVlad Serebrennikov struct aggregate { 859d358b2deSVlad Serebrennikov int x; 860d358b2deSVlad Serebrennikov int y; 861d358b2deSVlad Serebrennikov trivial t; 862d358b2deSVlad Serebrennikov std_layout sl; 863d358b2deSVlad Serebrennikov }; 864d358b2deSVlad Serebrennikov aggregate aggr = {}; 865d358b2deSVlad Serebrennikov 866d358b2deSVlad Serebrennikov void f(...); 867d358b2deSVlad Serebrennikov void g(trivial t) { f(t); } 868d358b2deSVlad Serebrennikov // cxx98-error@-1 {{cannot pass object of non-POD type 'trivial' through variadic function; call will abort at runtime}} 869d358b2deSVlad Serebrennikov 870d358b2deSVlad Serebrennikov void jump() { 871d358b2deSVlad Serebrennikov goto x; 872d358b2deSVlad Serebrennikov // cxx98-error@-1 {{cannot jump from this goto statement to its label}} 873d358b2deSVlad Serebrennikov // cxx98-note@#cwg568-t {{jump bypasses initialization of non-POD variable}} 874d358b2deSVlad Serebrennikov trivial t; // #cwg568-t 875d358b2deSVlad Serebrennikov x: ; 876d358b2deSVlad Serebrennikov } 877463e61a0SVlad Serebrennikov } // namespace cwg568 878d358b2deSVlad Serebrennikov 879*14ba3f9dSVlad Serebrennikov namespace cwg569 { // cwg569: 2.7 c++11 880d358b2deSVlad Serebrennikov // FIXME: This is a DR issue against C++98, so should probably apply there 881d358b2deSVlad Serebrennikov // too. 882d358b2deSVlad Serebrennikov ;;;;; 883d358b2deSVlad Serebrennikov // cxx98-error@-1 {{C++11 extension}} 884463e61a0SVlad Serebrennikov } // namespace cwg569 885d358b2deSVlad Serebrennikov 886d358b2deSVlad Serebrennikov namespace cwg570 { // cwg570: dup 633 887d358b2deSVlad Serebrennikov int n; 888d358b2deSVlad Serebrennikov int &r = n; // #cwg570-r 889d358b2deSVlad Serebrennikov int &r = n; 890d358b2deSVlad Serebrennikov // expected-error@-1 {{redefinition of 'r'}} 891d358b2deSVlad Serebrennikov // expected-note@#cwg570-r {{previous definition is here}} 892463e61a0SVlad Serebrennikov } // namespace cwg570 893d358b2deSVlad Serebrennikov 894d358b2deSVlad Serebrennikov // cwg571 is in cwg571.cpp 895d358b2deSVlad Serebrennikov 896*14ba3f9dSVlad Serebrennikov namespace cwg572 { // cwg572: 2.7 897d358b2deSVlad Serebrennikov enum E { a = 1, b = 2 }; 898d358b2deSVlad Serebrennikov static_assert(a + b == 3, ""); 899463e61a0SVlad Serebrennikov } // namespace cwg572 900d358b2deSVlad Serebrennikov 901d358b2deSVlad Serebrennikov namespace cwg573 { // cwg573: no 902d358b2deSVlad Serebrennikov void *a; 903d358b2deSVlad Serebrennikov int *b = reinterpret_cast<int*>(a); 904d358b2deSVlad Serebrennikov void (*c)() = reinterpret_cast<void(*)()>(a); 905d358b2deSVlad Serebrennikov // cxx98-error@-1 {{cast between pointer-to-function and pointer-to-object is an extension}} 906d358b2deSVlad Serebrennikov void *d = reinterpret_cast<void*>(c); 907d358b2deSVlad Serebrennikov // cxx98-error@-1 {{cast between pointer-to-function and pointer-to-object is an extension}} 908d358b2deSVlad Serebrennikov void f() { delete a; } 909788731cdSVlad Serebrennikov // cxx98-23-error@-1 {{cannot delete expression with pointer-to-'void' type 'void *'}} 910788731cdSVlad Serebrennikov // since-cxx26-error@-2 {{cannot delete pointer to incomplete type 'void'}} 911d358b2deSVlad Serebrennikov int n = d - a; 912d358b2deSVlad Serebrennikov // expected-error@-1 {{arithmetic on pointers to void}} 913d358b2deSVlad Serebrennikov // FIXME: This is ill-formed. 914d358b2deSVlad Serebrennikov template<void*> struct S; 915d358b2deSVlad Serebrennikov template<int*> struct T; 916463e61a0SVlad Serebrennikov } // namespace cwg573 917d358b2deSVlad Serebrennikov 918d358b2deSVlad Serebrennikov namespace cwg574 { // cwg574: 3.0 919d358b2deSVlad Serebrennikov struct A { 920d358b2deSVlad Serebrennikov A &operator=(const A&) const; // #cwg574-A-copy-assign 921d358b2deSVlad Serebrennikov }; 922d358b2deSVlad Serebrennikov struct B { 923d358b2deSVlad Serebrennikov B &operator=(const B&) volatile; // #cwg574-B-copy-assign 924d358b2deSVlad Serebrennikov }; 925d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L 926d358b2deSVlad Serebrennikov struct C { 927d358b2deSVlad Serebrennikov C &operator=(const C&) &; // #cwg574-C-copy-assign 928d358b2deSVlad Serebrennikov }; 929d358b2deSVlad Serebrennikov struct D { 930d358b2deSVlad Serebrennikov D &operator=(const D&) &&; // #cwg574-D-copy-assign 931d358b2deSVlad Serebrennikov }; 932d358b2deSVlad Serebrennikov void test(C c, D d) { 933d358b2deSVlad Serebrennikov c = c; 934d358b2deSVlad Serebrennikov C() = c; 935d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{no viable overloaded '='}} 936d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg574-C-copy-assign {{candidate function not viable: expects an lvalue for object argument}} 937d358b2deSVlad Serebrennikov d = d; 938d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{no viable overloaded '='}} 939d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg574-D-copy-assign {{candidate function not viable: expects an rvalue for object argument}} 940d358b2deSVlad Serebrennikov D() = d; 941d358b2deSVlad Serebrennikov } 942d358b2deSVlad Serebrennikov #endif 943d358b2deSVlad Serebrennikov struct Test { 944d358b2deSVlad Serebrennikov friend A &A::operator=(const A&); 945d358b2deSVlad Serebrennikov // expected-error@-1 {{friend declaration of 'operator=' does not match any declaration in 'cwg574::A'}} 946d358b2deSVlad Serebrennikov // expected-note@#cwg574-A-copy-assign {{candidate function has different qualifiers (expected unqualified but found 'const')}} 947d358b2deSVlad Serebrennikov friend B &B::operator=(const B&); 948d358b2deSVlad Serebrennikov // expected-error@-1 {{friend declaration of 'operator=' does not match any declaration in 'cwg574::B'}} 949d358b2deSVlad Serebrennikov // expected-note@#cwg574-B-copy-assign {{candidate function has different qualifiers (expected unqualified but found 'volatile')}} 950d358b2deSVlad Serebrennikov #if __cplusplus >= 202302L 951d358b2deSVlad Serebrennikov friend C &C::operator=(const C&); 952d358b2deSVlad Serebrennikov // since-cxx23-error@-1 {{conflicting types for 'operator='}} 953d358b2deSVlad Serebrennikov // since-cxx23-note@#cwg574-C-copy-assign {{previous declaration is here}} 954d358b2deSVlad Serebrennikov friend D &D::operator=(const D&); 955d358b2deSVlad Serebrennikov // since-cxx23-error@-1 {{conflicting types for 'operator='}} 956d358b2deSVlad Serebrennikov // since-cxx23-note@#cwg574-D-copy-assign {{previous declaration is here}} 957d358b2deSVlad Serebrennikov #elif __cplusplus >= 201103L 958d358b2deSVlad Serebrennikov // FIXME: We shouldn't produce the 'cannot overload' diagnostics here. 959d358b2deSVlad Serebrennikov friend C &C::operator=(const C&); // #cwg574-test-C 960d358b2deSVlad Serebrennikov // since-cxx11-error@#cwg574-test-C {{cannot overload}} 961d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg574-C-copy-assign {{previous declaration is here}} 962d358b2deSVlad Serebrennikov // since-cxx11-error@#cwg574-test-C {{friend declaration of 'operator=' does not match any declaration in 'cwg574::C'}} 963d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg574-C-copy-assign {{candidate function}} 964d358b2deSVlad Serebrennikov friend D &D::operator=(const D&); // #cwg574-test-D 965d358b2deSVlad Serebrennikov // since-cxx11-error@#cwg574-test-D {{cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'}} 966d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg574-D-copy-assign {{previous declaration is here}} 967d358b2deSVlad Serebrennikov // since-cxx11-error@#cwg574-test-D {{friend declaration of 'operator=' does not match any declaration in 'cwg574::D'}} 968d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg574-D-copy-assign {{candidate function}} 969d358b2deSVlad Serebrennikov #endif 970d358b2deSVlad Serebrennikov }; 971463e61a0SVlad Serebrennikov } // namespace cwg574 972d358b2deSVlad Serebrennikov 973*14ba3f9dSVlad Serebrennikov namespace cwg575 { // cwg575: 2.7 974d358b2deSVlad Serebrennikov template<typename T, typename U = typename T::type> void a(T); void a(...); 975d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 976d358b2deSVlad Serebrennikov template<typename T, typename T::type U = 0> void b(T); void b(...); 977d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 978d358b2deSVlad Serebrennikov template<typename T, int U = T::value> void c(T); void c(...); 979d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 980d358b2deSVlad Serebrennikov template<typename T> void d(T, int = T::value); void d(...); 981d358b2deSVlad Serebrennikov // expected-error@-1 {{type 'int' cannot be used prior to '::' because it has no members}} 982d358b2deSVlad Serebrennikov // expected-note@#cwg575-d {{in instantiation of default function argument expression for 'd<int>' required here}} 983d358b2deSVlad Serebrennikov void x() { 984d358b2deSVlad Serebrennikov a(0); 985d358b2deSVlad Serebrennikov b(0); 986d358b2deSVlad Serebrennikov c(0); 987d358b2deSVlad Serebrennikov d(0); // #cwg575-d 988d358b2deSVlad Serebrennikov } 989d358b2deSVlad Serebrennikov 990d358b2deSVlad Serebrennikov template<typename T = int&> void f(T* = 0); 991d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 992d358b2deSVlad Serebrennikov template<typename T = int> void f(T = 0); 993d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 994d358b2deSVlad Serebrennikov void g() { f<>(); } 995d358b2deSVlad Serebrennikov 996d358b2deSVlad Serebrennikov template<typename T> T &h(T *); 997d358b2deSVlad Serebrennikov template<typename T> T *h(T *); 998d358b2deSVlad Serebrennikov void *p = h((void*)0); 999463e61a0SVlad Serebrennikov } // namespace cwg575 1000d358b2deSVlad Serebrennikov 1001d358b2deSVlad Serebrennikov namespace cwg576 { // cwg576: 3.5 1002d358b2deSVlad Serebrennikov typedef void f() {} 1003d358b2deSVlad Serebrennikov // expected-error@-1 {{function definition declared 'typedef'}} 1004d358b2deSVlad Serebrennikov void f(typedef int n); 1005d358b2deSVlad Serebrennikov // expected-error@-1 {{invalid storage class specifier in function declarator}} 1006d358b2deSVlad Serebrennikov void f(char c) { typedef int n; } 1007463e61a0SVlad Serebrennikov } // namespace cwg576 1008d358b2deSVlad Serebrennikov 1009d358b2deSVlad Serebrennikov namespace cwg577 { // cwg577: 3.5 1010d358b2deSVlad Serebrennikov typedef void V; 1011d358b2deSVlad Serebrennikov typedef const void CV; 1012d358b2deSVlad Serebrennikov void a(void); 1013d358b2deSVlad Serebrennikov void b(const void); 1014d358b2deSVlad Serebrennikov // expected-error@-1 {{'void' as parameter must not have type qualifiers}} 1015d358b2deSVlad Serebrennikov void c(V); 1016d358b2deSVlad Serebrennikov void d(CV); 1017d358b2deSVlad Serebrennikov // expected-error@-1 {{'void' as parameter must not have type qualifiers}} 1018d358b2deSVlad Serebrennikov void (*e)(void) = c; 1019d358b2deSVlad Serebrennikov void (*f)(const void); 1020d358b2deSVlad Serebrennikov // expected-error@-1 {{'void' as parameter must not have type qualifiers}} 1021d358b2deSVlad Serebrennikov void (*g)(V) = a; 1022d358b2deSVlad Serebrennikov void (*h)(CV); 1023d358b2deSVlad Serebrennikov // expected-error@-1 {{'void' as parameter must not have type qualifiers}} 1024d358b2deSVlad Serebrennikov template<typename T> void i(T); // #cwg577-i 1025d358b2deSVlad Serebrennikov template<typename T> void j(void (*)(T)); // #cwg577-j 1026d358b2deSVlad Serebrennikov void k() { 1027d358b2deSVlad Serebrennikov a(); 1028d358b2deSVlad Serebrennikov c(); 1029d358b2deSVlad Serebrennikov i<void>(); 1030d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'i'}} 1031d358b2deSVlad Serebrennikov // expected-note@#cwg577-i {{candidate function template not viable: requires 1 argument, but 0 were provided}} 1032d358b2deSVlad Serebrennikov i<const void>(); 1033d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'i'}} 1034d358b2deSVlad Serebrennikov // expected-note@#cwg577-i {{candidate function template not viable: requires 1 argument, but 0 were provided}} 1035d358b2deSVlad Serebrennikov j<void>(0); 1036d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'j'}} 1037d358b2deSVlad Serebrennikov // expected-note@#cwg577-j {{candidate template ignored: substitution failure [with T = void]: argument may not have 'void' type}} 1038d358b2deSVlad Serebrennikov j<const void>(0); 1039d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'j'}} 1040d358b2deSVlad Serebrennikov // expected-note@#cwg577-j {{candidate template ignored: substitution failure [with T = const void]: argument may not have 'void' type}} 1041d358b2deSVlad Serebrennikov } 1042463e61a0SVlad Serebrennikov } // namespace cwg577 1043d358b2deSVlad Serebrennikov 1044d358b2deSVlad Serebrennikov namespace cwg580 { // cwg580: partial 1045d358b2deSVlad Serebrennikov class C; 1046d358b2deSVlad Serebrennikov struct A { static C c; }; 1047d358b2deSVlad Serebrennikov struct B { static C c; }; 1048d358b2deSVlad Serebrennikov class C { 1049d358b2deSVlad Serebrennikov C(); // #cwg580-C-ctor 1050d358b2deSVlad Serebrennikov ~C(); // #cwg580-C-dtor 1051d358b2deSVlad Serebrennikov 1052d358b2deSVlad Serebrennikov typedef int I; // #cwg580-I 1053d358b2deSVlad Serebrennikov template<int> struct X; 1054d358b2deSVlad Serebrennikov template<int> friend struct Y; 1055d358b2deSVlad Serebrennikov template<int> void f(); 1056d358b2deSVlad Serebrennikov template<int> friend void g(); 1057d358b2deSVlad Serebrennikov friend struct A; 1058d358b2deSVlad Serebrennikov }; 1059d358b2deSVlad Serebrennikov 1060d358b2deSVlad Serebrennikov template<C::I> struct C::X {}; 1061d358b2deSVlad Serebrennikov template<C::I> struct Y {}; 1062d358b2deSVlad Serebrennikov template<C::I> struct Z {}; 1063d358b2deSVlad Serebrennikov // expected-error@-1 {{'I' is a private member of 'cwg580::C'}} 1064d358b2deSVlad Serebrennikov // expected-note@#cwg580-I {{implicitly declared private here}} 1065d358b2deSVlad Serebrennikov 1066d358b2deSVlad Serebrennikov struct C2 { 1067d358b2deSVlad Serebrennikov class X { 1068d358b2deSVlad Serebrennikov struct A; 1069d358b2deSVlad Serebrennikov typedef int I; 1070d358b2deSVlad Serebrennikov friend struct A; 1071d358b2deSVlad Serebrennikov }; 1072d358b2deSVlad Serebrennikov class Y { 1073d358b2deSVlad Serebrennikov // FIXME: We incorrectly accept this 1074d358b2deSVlad Serebrennikov // because we think C2::Y::A<...> might 1075d358b2deSVlad Serebrennikov // instantiate to C2::X::A 1076d358b2deSVlad Serebrennikov template<X::I> struct A {}; 1077d358b2deSVlad Serebrennikov }; 1078d358b2deSVlad Serebrennikov }; 1079d358b2deSVlad Serebrennikov 1080d358b2deSVlad Serebrennikov template<C::I> void C::f() {} 1081d358b2deSVlad Serebrennikov template<C::I> void g() {} 1082d358b2deSVlad Serebrennikov template<C::I> void h() {} 1083d358b2deSVlad Serebrennikov // expected-error@-1 {{'I' is a private member of 'cwg580::C'}} 1084d358b2deSVlad Serebrennikov // expected-note@#cwg580-I {{implicitly declared private here}} 1085d358b2deSVlad Serebrennikov 1086d358b2deSVlad Serebrennikov C A::c; 1087d358b2deSVlad Serebrennikov C B::c; // #cwg580-c 1088d358b2deSVlad Serebrennikov // expected-error@#cwg580-c {{calling a private constructor of class 'cwg580::C'}} 1089d358b2deSVlad Serebrennikov // expected-note@#cwg580-C-ctor {{implicitly declared private here}} 1090d358b2deSVlad Serebrennikov // expected-error@#cwg580-c {{variable of type 'C' has private destructor}} 1091d358b2deSVlad Serebrennikov // expected-note@#cwg580-C-dtor {{implicitly declared private here}} 1092463e61a0SVlad Serebrennikov } // namespace cwg580 1093d358b2deSVlad Serebrennikov 1094d358b2deSVlad Serebrennikov // cwg582: na 1095d358b2deSVlad Serebrennikov 1096d358b2deSVlad Serebrennikov namespace cwg583 { // cwg583: 4 1097d358b2deSVlad Serebrennikov // see n3624 1098d358b2deSVlad Serebrennikov int *p; 1099d358b2deSVlad Serebrennikov bool b1 = p < 0; 1100d358b2deSVlad Serebrennikov // expected-error@-1 {{ordered comparison between pointer and zero ('int *' and 'int')}} 1101d358b2deSVlad Serebrennikov bool b2 = p > 0; 1102d358b2deSVlad Serebrennikov // expected-error@-1 {{ordered comparison between pointer and zero ('int *' and 'int')}} 1103d358b2deSVlad Serebrennikov bool b3 = p <= 0; 1104d358b2deSVlad Serebrennikov // expected-error@-1 {{ordered comparison between pointer and zero ('int *' and 'int')}} 1105d358b2deSVlad Serebrennikov bool b4 = p >= 0; 1106d358b2deSVlad Serebrennikov // expected-error@-1 {{ordered comparison between pointer and zero ('int *' and 'int')}} 1107463e61a0SVlad Serebrennikov } // namespace cwg583 1108d358b2deSVlad Serebrennikov 1109d358b2deSVlad Serebrennikov // cwg584: na 1110d358b2deSVlad Serebrennikov 1111d358b2deSVlad Serebrennikov namespace cwg585 { // cwg585: 3.0 1112d358b2deSVlad Serebrennikov template<typename> struct T; // #cwg585-struct-T 1113d358b2deSVlad Serebrennikov struct A { 1114d358b2deSVlad Serebrennikov friend T; 1115d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{a type specifier is required for all declarations}} 1116d358b2deSVlad Serebrennikov // cxx98-14-error@-2 {{friends can only be classes or functions}} 1117d358b2deSVlad Serebrennikov // since-cxx17-error@-3 {{use of class template 'T' requires template arguments; argument deduction not allowed in friend declaration}} 1118d358b2deSVlad Serebrennikov // since-cxx17-note@#cwg585-struct-T {{template is declared here}} 1119d358b2deSVlad Serebrennikov // FIXME: It's not clear whether the standard allows this or what it means, 1120d358b2deSVlad Serebrennikov // but the CWG585 writeup suggests it as an alternative. 1121d358b2deSVlad Serebrennikov template<typename U> friend T<U>; 1122d358b2deSVlad Serebrennikov // expected-error@-1 {{friend type templates must use an elaborated type}} 1123d358b2deSVlad Serebrennikov }; 1124d358b2deSVlad Serebrennikov template<template<typename> class T> struct B { // #cwg585-template-T 1125d358b2deSVlad Serebrennikov friend T; 1126d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{a type specifier is required for all declarations}} 1127d358b2deSVlad Serebrennikov // cxx98-14-error@-2 {{friends can only be classes or functions}} 1128d358b2deSVlad Serebrennikov // since-cxx17-error@-3 {{use of template template parameter 'T' requires template arguments; argument deduction not allowed in friend declaration}} 1129d358b2deSVlad Serebrennikov // since-cxx17-note@#cwg585-template-T {{template is declared here}} 1130d358b2deSVlad Serebrennikov template<typename U> friend T<U>; 1131d358b2deSVlad Serebrennikov // expected-error@-1 {{friend type templates must use an elaborated type}} 1132d358b2deSVlad Serebrennikov }; 1133463e61a0SVlad Serebrennikov } // namespace cwg585 1134d358b2deSVlad Serebrennikov 1135d358b2deSVlad Serebrennikov // cwg586: na 1136d358b2deSVlad Serebrennikov 1137d358b2deSVlad Serebrennikov namespace cwg587 { // cwg587: 3.2 1138d358b2deSVlad Serebrennikov template<typename T> void f(bool b, const T x, T y) { 1139d358b2deSVlad Serebrennikov const T *p = &(b ? x : y); 1140d358b2deSVlad Serebrennikov } 1141d358b2deSVlad Serebrennikov struct S {}; 1142d358b2deSVlad Serebrennikov template void f(bool, const int, int); 1143d358b2deSVlad Serebrennikov template void f(bool, const S, S); 1144463e61a0SVlad Serebrennikov } // namespace cwg587 1145d358b2deSVlad Serebrennikov 1146*14ba3f9dSVlad Serebrennikov namespace cwg588 { // cwg588: 2.7 1147d358b2deSVlad Serebrennikov struct A { int n; }; // #cwg588-A 1148d358b2deSVlad Serebrennikov template<typename T> int f() { 1149d358b2deSVlad Serebrennikov struct S : A, T { int f() { return n; } } s; 1150d358b2deSVlad Serebrennikov int a = s.f(); 1151d358b2deSVlad Serebrennikov int b = s.n; 1152d358b2deSVlad Serebrennikov // expected-error@-1 {{member 'n' found in multiple base classes of different types}} 1153d358b2deSVlad Serebrennikov // expected-note@#cwg588-k {{in instantiation of function template specialization 'cwg588::f<cwg588::B>' requested here}} 1154d358b2deSVlad Serebrennikov // expected-note@#cwg588-A {{member found by ambiguous name lookup}} 1155d358b2deSVlad Serebrennikov // expected-note@#cwg588-B {{member found by ambiguous name lookup}} 1156d358b2deSVlad Serebrennikov } 1157d358b2deSVlad Serebrennikov struct B { int n; }; // #cwg588-B 1158d358b2deSVlad Serebrennikov int k = f<B>(); // #cwg588-k 1159463e61a0SVlad Serebrennikov } // namespace cwg588 1160d358b2deSVlad Serebrennikov 1161*14ba3f9dSVlad Serebrennikov namespace cwg589 { // cwg589: 2.7 1162d358b2deSVlad Serebrennikov struct B { }; 1163d358b2deSVlad Serebrennikov struct D : B { }; 1164d358b2deSVlad Serebrennikov D f(); 1165d358b2deSVlad Serebrennikov extern const B &b; 1166d358b2deSVlad Serebrennikov bool a; 1167d358b2deSVlad Serebrennikov const B *p = &(a ? f() : b); 1168d358b2deSVlad Serebrennikov // expected-error@-1 {{taking the address of a temporary object of type 'const B'}} 1169d358b2deSVlad Serebrennikov const B *q = &(a ? D() : b); 1170d358b2deSVlad Serebrennikov // expected-error@-1 {{taking the address of a temporary object of type 'const B'}} 1171463e61a0SVlad Serebrennikov } // namespace cwg589 1172d358b2deSVlad Serebrennikov 1173*14ba3f9dSVlad Serebrennikov namespace cwg590 { // cwg590: 2.7 1174d358b2deSVlad Serebrennikov template<typename T> struct A { 1175d358b2deSVlad Serebrennikov struct B { 1176d358b2deSVlad Serebrennikov struct C { 1177d358b2deSVlad Serebrennikov A<T>::B::C f(A<T>::B::C); // ok, no 'typename' required. 1178d358b2deSVlad Serebrennikov }; 1179d358b2deSVlad Serebrennikov }; 1180d358b2deSVlad Serebrennikov }; 1181d358b2deSVlad Serebrennikov template<typename T> typename A<T>::B::C A<T>::B::C::f(A<T>::B::C) {} 1182463e61a0SVlad Serebrennikov } // namespace cwg590 1183d358b2deSVlad Serebrennikov 1184e1cb316cSVladislav Belov namespace cwg591 { // cwg591: 20 1185d358b2deSVlad Serebrennikov template<typename T> struct A { 1186d358b2deSVlad Serebrennikov typedef int M; 1187d358b2deSVlad Serebrennikov struct B { 1188d358b2deSVlad Serebrennikov typedef void M; 1189d358b2deSVlad Serebrennikov struct C; 1190e1cb316cSVladislav Belov struct D; 1191e1cb316cSVladislav Belov }; 1192e1cb316cSVladislav Belov }; 1193e1cb316cSVladislav Belov 1194e1cb316cSVladislav Belov template<typename T> struct G { 1195e1cb316cSVladislav Belov struct B { 1196e1cb316cSVladislav Belov typedef int M; 1197e1cb316cSVladislav Belov struct C { 1198e1cb316cSVladislav Belov typedef void M; 1199e1cb316cSVladislav Belov struct D; 1200e1cb316cSVladislav Belov }; 1201e1cb316cSVladislav Belov }; 1202e1cb316cSVladislav Belov }; 1203e1cb316cSVladislav Belov 1204e1cb316cSVladislav Belov template<typename T> struct H { 1205e1cb316cSVladislav Belov template<typename U> struct B { 1206e1cb316cSVladislav Belov typedef int M; 1207e1cb316cSVladislav Belov template<typename F> struct C { 1208e1cb316cSVladislav Belov typedef void M; 1209e1cb316cSVladislav Belov struct D; 1210e1cb316cSVladislav Belov struct P; 1211e1cb316cSVladislav Belov }; 1212d358b2deSVlad Serebrennikov }; 1213d358b2deSVlad Serebrennikov }; 1214d358b2deSVlad Serebrennikov 121501710aa3SVladislav Belov template <typename, bool> struct M { 121601710aa3SVladislav Belov class P; 121701710aa3SVladislav Belov int M; 121801710aa3SVladislav Belov }; 121901710aa3SVladislav Belov 1220d358b2deSVlad Serebrennikov template<typename T> struct A<T>::B::C : A<T> { 1221e1cb316cSVladislav Belov M m; 1222e1cb316cSVladislav Belov }; 1223e1cb316cSVladislav Belov 1224e1cb316cSVladislav Belov template<typename T> struct G<T>::B::C::D : B { 1225e1cb316cSVladislav Belov M m; 1226e1cb316cSVladislav Belov }; 1227e1cb316cSVladislav Belov 1228e1cb316cSVladislav Belov template<typename T> 1229e1cb316cSVladislav Belov template<typename U> 1230e1cb316cSVladislav Belov template<typename F> 1231e1cb316cSVladislav Belov struct H<T>::B<U>::C<F>::D : B<U> { 1232e1cb316cSVladislav Belov M m; 1233e1cb316cSVladislav Belov }; 1234e1cb316cSVladislav Belov 123501710aa3SVladislav Belov template<typename T, bool B> class M<T,B>::P : M { 123601710aa3SVladislav Belov int foo() { (void) M; } 123701710aa3SVladislav Belov }; 123801710aa3SVladislav Belov 1239e1cb316cSVladislav Belov template<typename T> struct A<T>::B::D : A<T*> { 1240e1cb316cSVladislav Belov M m; 1241e1cb316cSVladislav Belov // expected-error@-1 {{field has incomplete type 'M' (aka 'void'}} 1242e1cb316cSVladislav Belov }; 1243e1cb316cSVladislav Belov 1244e1cb316cSVladislav Belov template<typename T> 1245e1cb316cSVladislav Belov template<typename U> 1246e1cb316cSVladislav Belov template<typename F> 1247e1cb316cSVladislav Belov struct H<T>::B<U>::C<F>::P : B<F> { 1248d358b2deSVlad Serebrennikov M m; 1249d358b2deSVlad Serebrennikov // expected-error@-1 {{field has incomplete type 'M' (aka 'void'}} 1250d358b2deSVlad Serebrennikov }; 1251463e61a0SVlad Serebrennikov } // namespace cwg591 1252d358b2deSVlad Serebrennikov 1253d358b2deSVlad Serebrennikov // cwg592: na 1254d358b2deSVlad Serebrennikov // cwg593 is in cwg593.cpp 1255d358b2deSVlad Serebrennikov // cwg594: na 1256d358b2deSVlad Serebrennikov 1257d358b2deSVlad Serebrennikov namespace cwg595 { // cwg595: dup 1330 1258d358b2deSVlad Serebrennikov template<class T> struct X { 1259d358b2deSVlad Serebrennikov void f() throw(T) {} 1260d358b2deSVlad Serebrennikov // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}} 1261d358b2deSVlad Serebrennikov // since-cxx17-note@-2 {{use 'noexcept(false)' instead}} 1262d358b2deSVlad Serebrennikov }; 1263d358b2deSVlad Serebrennikov struct S { 1264d358b2deSVlad Serebrennikov X<S> xs; 1265d358b2deSVlad Serebrennikov }; 1266463e61a0SVlad Serebrennikov } // namespace cwg595 1267d358b2deSVlad Serebrennikov 1268d358b2deSVlad Serebrennikov // cwg597: na 1269d358b2deSVlad Serebrennikov 1270*14ba3f9dSVlad Serebrennikov namespace cwg598 { // cwg598: 2.7 1271d358b2deSVlad Serebrennikov namespace N { 1272d358b2deSVlad Serebrennikov void f(int); 1273d358b2deSVlad Serebrennikov void f(char); 1274d358b2deSVlad Serebrennikov // Not found by ADL. 1275d358b2deSVlad Serebrennikov void g(void (*)(int)); 1276d358b2deSVlad Serebrennikov void h(void (*)(int)); 1277d358b2deSVlad Serebrennikov 1278d358b2deSVlad Serebrennikov namespace M { 1279d358b2deSVlad Serebrennikov struct S {}; 1280d358b2deSVlad Serebrennikov int &h(void (*)(S)); 1281d358b2deSVlad Serebrennikov } 1282d358b2deSVlad Serebrennikov void i(M::S); 1283d358b2deSVlad Serebrennikov void i(); 1284d358b2deSVlad Serebrennikov } 1285d358b2deSVlad Serebrennikov int &g(void(*)(char)); 1286d358b2deSVlad Serebrennikov int &r = g(N::f); 1287d358b2deSVlad Serebrennikov int &s = h(N::f); 1288d358b2deSVlad Serebrennikov // expected-error@-1 {{use of undeclared identifier 'h'}} 1289d358b2deSVlad Serebrennikov int &t = h(N::i); 1290463e61a0SVlad Serebrennikov } // namespace cwg598 1291d358b2deSVlad Serebrennikov 1292d358b2deSVlad Serebrennikov namespace cwg599 { // cwg599: partial 1293d358b2deSVlad Serebrennikov typedef int Fn(); 1294d358b2deSVlad Serebrennikov struct S { operator void*(); }; 1295d358b2deSVlad Serebrennikov struct T { operator Fn*(); }; 1296d358b2deSVlad Serebrennikov struct U { operator int*(); operator void*(); }; // #cwg599-U 1297d358b2deSVlad Serebrennikov struct V { operator int*(); operator Fn*(); }; 1298d358b2deSVlad Serebrennikov void f(void *p, void (*q)(), S s, T t, U u, V v) { 1299d358b2deSVlad Serebrennikov delete p; 1300788731cdSVlad Serebrennikov // cxx98-23-error@-1 {{cannot delete expression with pointer-to-'void' type 'void *'}} 1301788731cdSVlad Serebrennikov // since-cxx26-error@-2 {{cannot delete pointer to incomplete type 'void'}} 1302d358b2deSVlad Serebrennikov delete q; 1303d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot delete expression of type 'void (*)()'}} 1304d358b2deSVlad Serebrennikov delete s; 1305788731cdSVlad Serebrennikov // cxx98-23-error@-1 {{cannot delete expression with pointer-to-'void' type 'void *'}} 1306788731cdSVlad Serebrennikov // since-cxx26-error@-2 {{cannot delete pointer to incomplete type 'void'}} 1307d358b2deSVlad Serebrennikov delete t; 1308d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot delete expression of type 'T'}} 1309d358b2deSVlad Serebrennikov // FIXME: This is valid, but is rejected due to a non-conforming GNU 1310d358b2deSVlad Serebrennikov // extension allowing deletion of pointers to void. 1311d358b2deSVlad Serebrennikov delete u; 1312d358b2deSVlad Serebrennikov // expected-error@-1 {{ambiguous conversion of delete expression of type 'U' to a pointer}} 1313d358b2deSVlad Serebrennikov // expected-note@#cwg599-U {{conversion to pointer type 'int *'}} 1314d358b2deSVlad Serebrennikov // expected-note@#cwg599-U {{conversion to pointer type 'void *'}} 1315d358b2deSVlad Serebrennikov delete v; 1316d358b2deSVlad Serebrennikov } 1317463e61a0SVlad Serebrennikov } // namespace cwg599 1318