xref: /llvm-project/clang/test/CXX/drs/cwg4xx.cpp (revision 14ba3f9d07ea1664497c5d117120fb243ca221aa)
1 // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++98 %s -verify=expected,cxx98-14,cxx98-17,cxx98 -fexceptions -fcxx-exceptions -pedantic-errors
2 // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++11 %s -verify=expected,cxx98-14,cxx98-17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
3 // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++14 %s -verify=expected,cxx98-14,cxx98-17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
4 // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++17 %s -verify=expected,since-cxx17,cxx98-17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
5 // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++20 %s -verify=expected,since-cxx20,since-cxx17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
6 // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++23 %s -verify=expected,since-cxx20,since-cxx17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
7 // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++2c %s -verify=expected,since-cxx20,since-cxx17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
8 
9 #if __cplusplus == 199711L
10 #define static_assert(...) __extension__ _Static_assert(__VA_ARGS__)
11 // cxx98-error@-1 {{variadic macros are a C99 feature}}
12 #endif
13 
14 // FIXME: __SIZE_TYPE__ expands to 'long long' on some targets.
15 __extension__ typedef __SIZE_TYPE__ size_t;
16 
17 namespace std { struct type_info; }
18 
19 namespace cwg400 { // cwg400: 2.7
20   struct A { int a; struct a {}; }; // #cwg400-A
21   struct B { int a; struct a {}; }; // #cwg400-B
22   struct C : A, B { using A::a; struct a b; };
23   struct D : A, B {
24     using A::a;
25     // FIXME: we should issue a single diagnostic
26     using B::a; // #cwg400-using-B-a
27     // expected-error@#cwg400-using-B-a {{target of using declaration conflicts with declaration already in scope}}
28     //   expected-note@#cwg400-B {{target of using declaration}}
29     //   expected-note@#cwg400-A {{conflicting declaration}}
30     // expected-error@#cwg400-using-B-a {{target of using declaration conflicts with declaration already in scope}}
31     //   expected-note@#cwg400-B {{target of using declaration}}
32     //   expected-note@#cwg400-A {{conflicting declaration}}
33     struct a b;
34   };
35   struct E : A, B { struct a b; };
36   // expected-error@-1 {{member 'a' found in multiple base classes of different types}}
37   //   expected-note@#cwg400-A {{member type 'cwg400::A::a' found by ambiguous name lookup}}
38   //   expected-note@#cwg400-B {{member type 'cwg400::B::a' found by ambiguous name lookup}}
39 } // namespace cwg400
40 
41 namespace cwg401 { // cwg401: 2.8
42   template<class T, class U = typename T::type> class A : public T {}; // #cwg401-A
43   // expected-error@#cwg401-A {{'type' is a private member of 'cwg401::C'}}
44   //   expected-note@#cwg402-friend-A-C {{in instantiation of default argument for 'A<C>' required here}}
45   //   expected-note@#cwg402-C-type {{implicitly declared private here}}
46   // expected-error@#cwg401-A {{'type' is a protected member of 'cwg401::B'}}
47   //   expected-note@#cwg402-b {{in instantiation of default argument for 'A<B>' required here}}
48   //   expected-note@#cwg402-B-type {{declared protected here}}
49   // expected-error@#cwg401-A {{'type' is a private member of 'cwg401::D'}}
50   //   expected-note@#cwg402-d {{in instantiation of default argument for 'A<D>' required here}}
51   //   expected-note@#cwg402-D-type {{implicitly declared private here}}
52   class B {
53   protected:
54     typedef int type; // #cwg402-B-type
55   };
56 
57   class C {
58     typedef int type; // #cwg402-C-type
59     friend class A<C>; // #cwg402-friend-A-C
60   };
61 
62   class D {
63     typedef int type; // #cwg402-D-type
64     friend class A<D, int>;
65   };
66 
67   A<B> *b; // #cwg402-b
68   A<D> *d; // #cwg402-d
69 
70   struct E {
71     template<class T, class U = typename T::type> class A : public T {};
72   };
73   class F {
74     typedef int type;
75     friend class E;
76   };
77   E::A<F> eaf; // ok, default argument is in befriended context
78 
79   // FIXME: Why do we get different diagnostics in C++11 onwards here? We seem
80   // to not treat the default template argument as a SFINAE context in C++98.
81   template<class T, class U = typename T::type> void f(T) {} // #cwg402-f
82   // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}}
83   // cxx98-error@-2 {{'type' is a protected member of 'cwg401::B'}}
84   //   cxx98-note@-3 {{in instantiation of default argument for 'f<B>' required here}}
85   //   cxx98-note@#cwg402-f-b {{while substituting deduced template arguments into function template 'f' [with T = B, U = (no value)]}}
86   //   cxx98-note@#cwg402-B-type {{declared protected here}}
87   void g(B b) { f(b); } // #cwg402-f-b
88   // since-cxx11-error@-1 {{no matching function for call to 'f'}}
89   //   since-cxx11-note@#cwg402-f {{candidate template ignored: substitution failure [with T = B, U = typename B::type]: 'type' is a protected member of 'cwg401::B'}}
90 } // namespace cwg401
91 
92 namespace cwg403 { // cwg403: 2.7
93   namespace A {
94     struct S {};
95     int f(void*);
96   }
97   template<typename T> struct X {};
98   typedef struct X<A::S>::X XS;
99   XS *p;
100   int k = f(p); // ok, finds A::f, even though type XS is a typedef-name
101                 // referring to an elaborated-type-specifier naming a
102                 // injected-class-name, which is about as far from a
103                 // template-id as we can make it.
104 } // namespace cwg403
105 
106 // cwg404: na
107 // (NB: also sup 594)
108 
109 namespace cwg405 { // cwg405: 2.7
110                    // NB: also dup 218
111   namespace A {
112     struct S {};
113     void f(S);
114   }
115   namespace B {
116     struct S {};
117     void f(S);
118   }
119 
120   struct C {
121     int f;
122     void test1(A::S as) { f(as); }
123     // expected-error@-1 {{called object type 'int' is not a function or function pointer}}
124     void test2(A::S as) { void f(); f(as); }
125     // expected-error@-1 {{too many arguments to function call, expected 0, have 1}}
126     //   expected-note@-2 {{'f' declared here}}
127     void test3(A::S as) { using A::f; f(as); } // ok
128     void test4(A::S as) { using B::f; f(as); } // ok
129     void test5(A::S as) { int f; f(as); }
130     // expected-error@-1 {{called object type 'int' is not a function or function pointer}}
131     void test6(A::S as) { struct f {}; (void) f(as); }
132     // expected-error@-1 {{no matching conversion for functional-style cast from 'A::S' to 'f'}}
133     //   expected-note@-2 {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'A::S' to 'const f' for 1st argument}}
134     //   since-cxx11-note@-3 {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'A::S' to 'f' for 1st argument}}
135     //   expected-note@-4 {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}}
136   };
137 
138   namespace D {
139     struct S {};
140     struct X { void operator()(S); } f;
141   }
142   void testD(D::S ds) { f(ds); }
143   // expected-error@-1 {{use of undeclared identifier 'f'}}
144 
145   namespace E {
146     struct S {};
147     struct f { f(S); };
148   }
149   void testE(E::S es) { f(es); }
150   // expected-error@-1 {{use of undeclared identifier 'f'}}
151 } // namespace cwg405
152 
153 namespace cwg406 { // cwg406: 2.9
154   typedef struct {
155     static int n;
156     // expected-error@-1 {{static data member 'n' not allowed in anonymous struct}}
157   } A;
158   typedef union {
159     static int n;
160     // expected-error@-1 {{static data member 'n' not allowed in anonymous union}}
161   } B;
162 } // namespace cwg406
163 
164 namespace cwg407 { // cwg407: 3.8
165                   // NB: reused by cwg1894 and cwg2199
166   struct S;
167   typedef struct S S;
168   void f() {
169     struct S *p;
170     {
171       typedef struct S S; // #cwg407-typedef-S
172       struct S *p;
173       // expected-error@-1 {{typedef 'S' cannot be referenced with the 'struct' specifier}}
174       //   expected-note@#cwg407-typedef-S {{declared here}}
175     }
176   }
177   struct S {};
178 
179   namespace UsingDir {
180     namespace A {
181       struct S {}; // #cwg407-A-S
182     }
183     namespace B {
184       typedef int S; // #cwg407-B-S
185     }
186     namespace C {
187       using namespace A;
188       using namespace B;
189       struct S s;
190       // expected-error@-1 {{ambiguous}}
191       //   expected-note@#cwg407-A-S {{candidate found by name lookup is 'cwg407::UsingDir::A::S'}}
192       //   expected-note@#cwg407-B-S {{candidate found by name lookup is 'cwg407::UsingDir::B::S'}}
193     }
194     namespace D {
195       using A::S;
196       typedef struct S S;
197       struct S s;
198     }
199     namespace E {
200       // The standard doesn't say whether this is valid. We interpret
201       // CWG407 as meaning "if lookup finds both a tag and a typedef with the
202       // same type, then it's OK in an elaborated-type-specifier".
203       typedef A::S S;
204       using A::S;
205       struct S s;
206     }
207     namespace F {
208       typedef A::S S;
209     }
210     // The standard doesn't say what to do in these cases either.
211     namespace G {
212       using namespace A;
213       using namespace F;
214       struct S s;
215     }
216     namespace H {
217       using namespace F;
218       using namespace A;
219       struct S s;
220     }
221   }
222 } // namespace cwg407
223 
224 namespace cwg408 { // cwg408: 3.4
225   template<int N> void g() { static_assert(N != 1, ""); }
226   template<> void g<2>() { }
227 
228   template<typename T> struct S {
229     static int i[];
230     void f();
231   };
232   template<typename T> int S<T>::i[] = { 1 };
233 
234   template<typename T> void S<T>::f() {
235     g<sizeof (i) / sizeof (int)>();
236   }
237   template<> int S<int>::i[] = { 1, 2 };
238   template void S<int>::f(); // uses g<2>(), not g<1>().
239 
240 
241   template<typename T> struct R {
242     static int arr[];
243     void f();
244   };
245   template<typename T> int R<T>::arr[1];
246   template<typename T> void R<T>::f() {
247     static_assert(sizeof(arr) != sizeof(int), "");
248   }
249   template<> int R<int>::arr[2];
250   template void R<int>::f();
251 } // namespace cwg408
252 
253 namespace cwg409 { // cwg409: 2.7
254   template<typename T> struct A {
255     typedef int B;
256     B b1;
257     A::B b2;
258     A<T>::B b3;
259     A<T*>::B b4;
260     // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name A<T *>::B; implicit 'typename' is a C++20 extension}}
261   };
262 } // namespace cwg409
263 
264 namespace cwg410 { // cwg410: no
265   template<class T> void f(T);
266   void g(int);
267   namespace M {
268     template<class T> void h(T);
269     template<class T> void i(T);
270     struct A {
271       friend void f<>(int);
272       friend void h<>(int);
273       friend void g(int);
274       template<class T> void i(T);
275       friend void i<>(int);
276     private:
277       static void z(); // #cwg410-z
278     };
279 
280     template<> void h(int) { A::z(); }
281     // FIXME: This should be ill-formed. The member A::i<> is befriended,
282     // not this function.
283     template<> void i(int) { A::z(); }
284   }
285   template<> void f(int) { M::A::z(); }
286   void g(int) { M::A::z(); }
287   // expected-error@-1 {{'z' is a private member of 'cwg410::M::A'}}
288   //   expected-note@#cwg410-z {{declared private here}}
289 } // namespace cwg410
290 
291 // cwg412 is in cwg412.cpp
292 
293 namespace cwg413 { // cwg413: 2.7
294   struct S {
295     int a;
296     int : 17;
297     int b;
298   };
299   S s = { 1, 2, 3 };
300   // expected-error@-1 {{excess elements in struct initializer}}
301 
302   struct E {};
303   struct T { // #cwg413-T
304     int a;
305     E e;
306     int b;
307   };
308   T t1 = { 1, {}, 2 };
309   T t2 = { 1, 2 };
310   // expected-error@-1 {{initializer for aggregate with no elements requires explicit braces}}
311   //   expected-note@#cwg413-T {{'cwg413::T' declared here}}
312 } // namespace cwg413
313 
314 namespace cwg414 { // cwg414: dup 305
315   struct X {};
316   void f() {
317     X x;
318     struct X {};
319     x.~X();
320   }
321 } // namespace cwg414
322 
323 namespace cwg415 { // cwg415: 2.7
324   template<typename T> void f(T, ...) { T::error; }
325   void f(int, int);
326   void g() { f(0, 0); } // ok
327 } // namespace cwg415
328 
329 namespace cwg416 { // cwg416: 2.7
330   extern struct A a;
331   int &operator+(const A&, const A&);
332   int &k = a + a;
333   struct A { float &operator+(A&); };
334   float &f = a + a;
335 } // namespace cwg416
336 
337 namespace cwg417 { // cwg417: no
338   struct A;
339   struct cwg417::A {};
340   // expected-warning@-1 {{extra qualification on member 'A'}}
341   struct B { struct X; };
342   struct C : B {};
343   struct C::X {};
344   // expected-error@-1 {{no struct named 'X' in 'cwg417::C'}}
345   struct B::X { struct Y; };
346   struct C::X::Y {}; // ok!
347   namespace N {
348     struct D;
349     struct E;
350     struct F;
351     struct H;
352   }
353   // FIXME: This is ill-formed.
354   using N::D;
355   struct cwg417::D {};
356   // expected-warning@-1 {{extra qualification on member 'D'}}
357   using namespace N;
358   struct cwg417::E {};
359   // expected-error@-1 {{no struct named 'E' in namespace 'cwg417'}}
360   // expected-warning@-2 {{extra qualification on member 'E'}}
361   struct N::F {};
362   struct G;
363   using N::H;
364   namespace M {
365     struct cwg417::G {};
366     // expected-error@-1 {{cannot define or redeclare 'G' here because namespace 'M' does not enclose namespace 'cwg417'}}
367     struct cwg417::H {};
368     // expected-error@-1 {{cannot define or redeclare 'H' here because namespace 'M' does not enclose namespace 'cwg417'}}
369   }
370 } // namespace cwg417
371 
372 namespace cwg418 { // cwg418: no
373 namespace example1 {
374 void f1(int, int = 0);
375 void f1(int = 0, int);
376 
377 void g() { f1(); }
378 } // namespace example1
379 
380 namespace example2 {
381 namespace A {
382 void f2(int); // #cwg418-f2
383 }
384 namespace B {
385 using A::f2;
386 }
387 namespace A {
388 void f2(int = 3);
389 }
390 void g2() {
391   using B::f2;
392   f2();
393   // expected-error@-1 {{no matching function for call to 'f2'}}
394   //   expected-note@#cwg418-f2 {{candidate function not viable: requires 1 argument, but 0 were provided}}
395 }
396 } // namespace example2
397 
398 // example from [over.match.best]/4
399 namespace example3 {
400 namespace A {
401 extern "C" void f(int = 5);
402 }
403 namespace B {
404 extern "C" void f(int = 5);
405 }
406 
407 using A::f;
408 using B::f;
409 
410 void use() {
411   f(3);
412   f(); // FIXME: this should fail
413 }
414 } // namespace example3
415 } // namespace cwg418
416 
417 namespace cwg420 { // cwg420: 9
418   template<typename T> struct ptr {
419     T *operator->() const;
420     T &operator*() const;
421   };
422   template<typename T, typename P> void test(P p) {
423     p->~T();
424     p->T::~T();
425     (*p).~T();
426     (*p).T::~T();
427   }
428   struct X {};
429   template void test<int>(int*);
430   template void test<int>(ptr<int>);
431   template void test<X>(X*);
432   template void test<X>(ptr<X>);
433 
434   template<typename T>
435   void test2(T p) {
436     p->template Y<int>::~Y<int>();
437     p->~Y<int>();
438     p->template ~Y<int>();
439     // expected-error@-1 {{'template' keyword not permitted in destructor name}}
440   }
441   template<typename T> struct Y {};
442   template void test2(Y<int>*);
443   template void test2(ptr<Y<int> >);
444 
445   void test3(int *p, ptr<int> q) {
446     typedef int Int;
447     p->~Int();
448     q->~Int();
449     p->Int::~Int();
450     q->Int::~Int();
451   }
452 
453 #if __cplusplus >= 201103L
454   template<typename T> using id = T;
455   struct A { template<typename T> using id = T; };
456   void test4(int *p, ptr<int> q) {
457     p->~id<int>();
458     q->~id<int>();
459     p->id<int>::~id<int>();
460     q->id<int>::~id<int>();
461     p->template id<int>::~id<int>(); // OK since cwg2292
462     q->template id<int>::~id<int>(); // OK since cwg2292
463     p->A::template id<int>::~id<int>();
464     q->A::template id<int>::~id<int>();
465   }
466 #endif
467 } // namespace cwg420
468 
469 namespace cwg421 { // cwg421: 2.7
470   struct X { X(); int n; int &r; };
471   int *p = &X().n;
472   // cxx98-error@-1 {{taking the address of a temporary object of type 'int'}}
473   // since-cxx11-error@-2 {{cannot take the address of an rvalue of type 'int'}}
474   int *q = &X().r;
475 } // namespace cwg421
476 
477 namespace cwg422 { // cwg422: 2.7
478   template<typename T, typename U> void f() {
479     typedef T type; // #cwg422-typedef-T
480     typedef U type;
481     // expected-error@-1 {{typedef redefinition with different types ('char' vs 'int')}}
482     //   expected-note@#cwg422-f-int-char {{in instantiation of function template specialization 'cwg422::f<int, char>' requested here}}
483     //   expected-note@#cwg422-typedef-T {{previous definition is here}}
484   }
485   template void f<int, int>();
486   template void f<int, char>(); // #cwg422-f-int-char
487 } // namespace cwg422
488 
489 namespace cwg423 { // cwg423: 2.7
490   template<typename T> struct X { operator T&(); };
491   void f(X<int> x) { x += 1; }
492 } // namespace cwg423
493 
494 namespace cwg424 { // cwg424: 2.7
495   struct A {
496     typedef int N; // #cwg424-N
497     typedef int N;
498     // expected-error@-1 {{redefinition of 'N'}}
499     //   expected-note@#cwg424-N {{previous definition is here}}
500 
501     struct X;
502     typedef X X; // #cwg424-X
503     struct X {};
504 
505     struct X *p;
506     struct A::X *q;
507     X *r;
508 
509     typedef X X;
510     // expected-error@-1 {{redefinition of 'X'}}
511     //   expected-note@#cwg424-X {{previous definition is here}}
512   };
513   struct B {
514     typedef int M;
515   };
516   struct C : B {
517     typedef int M; // #cwg424-M
518     typedef int M;
519     // expected-error@-1 {{redefinition of 'M'}}
520     //   expected-note@#cwg424-M {{previous definition is here}}
521   };
522 } // namespace cwg424
523 
524 namespace cwg425 { // cwg425: 2.7
525   struct A { template<typename T> operator T() const; } a;
526   float f = 1.0f * a;
527   // expected-error@-1 {{use of overloaded operator '*' is ambiguous (with operand types 'float' and 'struct A')}}
528   //   expected-note@-2 +{{built-in candidate operator*}}
529 
530   template<typename T> struct is_float;
531   template<> struct is_float<float> { typedef void type; };
532 
533   struct B {
534     template<typename T, typename U = typename is_float<T>::type> operator T() const;
535     // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}}
536   } b;
537   float g = 1.0f * b; // ok
538 } // namespace cwg425
539 
540 namespace cwg427 { // cwg427: 2.7
541   struct B {};
542   struct D : public B {
543     D(B &) = delete; // #cwg427-D
544     // cxx98-error@-1 {{deleted function definitions are a C++11 extension}}
545   };
546 
547   extern D d1;
548   B &b = d1;
549   const D &d2 = static_cast<const D&>(b);
550   const D &d3 = (const D&)b;
551   const D &d4(b);
552   // expected-error@-1 {{conversion function from 'B' to 'const D' invokes a deleted function}}
553   //   expected-note@#cwg427-D {{'D' has been explicitly marked deleted here}}
554 } // namespace cwg427
555 
556 namespace cwg428 { // cwg428: 2.7
557   template<typename T> T make();
558   extern struct X x; // #cwg428-X
559   void f() {
560     throw void();
561     // expected-error@-1 {{cannot throw object of incomplete type 'void'}}
562     throw make<void*>();
563     throw make<const volatile void*>();
564     throw x;
565     // expected-error@-1 {{cannot throw object of incomplete type 'struct X'}}
566     //   expected-note@#cwg428-X {{forward declaration of 'cwg428::X'}}
567     throw make<X&>();
568     // expected-error@-1 {{cannot throw object of incomplete type 'cwg428::X'}}
569     //   expected-note@#cwg428-X {{forward declaration of 'cwg428::X'}}
570     throw make<X*>();
571     // expected-error@-1 {{cannot throw pointer to object of incomplete type 'cwg428::X'}}
572     //   expected-note@#cwg428-X {{forward declaration of 'cwg428::X'}}
573     throw make<const volatile X&>();
574     // expected-error@-1 {{cannot throw object of incomplete type 'cwg428::X'}}
575     //   expected-note@#cwg428-X {{forward declaration of 'cwg428::X'}}
576     throw make<const volatile X*>();
577     // expected-error@-1 {{cannot throw pointer to object of incomplete type 'const volatile cwg428::X'}}
578     //   expected-note@#cwg428-X {{forward declaration of 'cwg428::X'}}
579   }
580 } // namespace cwg428
581 
582 namespace cwg429 { // cwg429: 2.8 c++11
583   // FIXME: This rule is obviously intended to apply to C++98 as well.
584   struct A {
585     static void *operator new(size_t, size_t);
586     static void operator delete(void*, size_t); // #cwg429-delete
587   } *a = new (0) A;
588   // since-cxx11-error@-1 {{'new' expression with placement arguments refers to non-placement 'operator delete'}}
589   //   since-cxx11-note@#cwg429-delete {{here}}
590   struct B {
591     static void *operator new(size_t, size_t);
592     static void operator delete(void*);
593     static void operator delete(void*, size_t);
594   } *b = new (0) B; // ok, second delete is not a non-placement deallocation function
595 } // namespace cwg429
596 
597 namespace cwg430 { // cwg430: 2.7 c++11
598   // resolved by n2239
599   // FIXME: This should apply in C++98 too.
600   void f(int n) {
601     int a[] = { n++, n++, n++ };
602     // cxx98-warning@-1 {{multiple unsequenced modifications to 'n'}}
603   }
604 } // namespace cwg430
605 
606 namespace cwg431 { // cwg431: 2.8
607   struct A {
608     template<typename T> T *get();
609     template<typename T> struct B {
610       template<typename U> U *get();
611     };
612   };
613 
614   template<typename T> void f(A a) {
615     a.get<A>()->get<T>();
616     a.get<T>()
617         ->get<T>();
618         // expected-error@-1 {{use 'template' keyword to treat 'get' as a dependent template name}}
619     a.get<T>()->template get<T>();
620     a.A::get<T>();
621     A::B<int> *b = a.get<A::B<int> >();
622     b->get<int>();
623     b->A::B<int>::get<int>();
624     b->A::B<int>::get<T>();
625     b->A::B<T>::get<int>();
626     // expected-error@-1 {{use 'template' keyword to treat 'get' as a dependent template name}}
627     b->A::B<T>::template get<int>();
628     b->A::B<T>::get<T>();
629     // expected-error@-1 {{use 'template' keyword to treat 'get' as a dependent template name}}
630     b->A::B<T>::template get<T>();
631     A::B<T> *c = a.get<A::B<T> >();
632     c->get<int>();
633     // expected-error@-1 {{use 'template' keyword to treat 'get' as a dependent template name}}
634     c->template get<int>();
635   }
636 } // namespace cwg431
637 
638 namespace cwg432 { // cwg432: 3.0
639   template<typename T> struct A {};
640   template<typename T> struct B : A<B> {};
641   // expected-error@-1 {{use of class template 'B' requires template arguments}}
642   //   expected-note@-2 {{template is declared here}}
643   template<typename T> struct C : A<C<T> > {};
644 #if __cplusplus >= 201103L
645   template<typename T> struct D : decltype(A<D>()) {};
646   // since-cxx11-error@-1 {{use of class template 'D' requires template arguments}}
647   //   since-cxx11-note@-2 {{template is declared here}}
648 #endif
649 } // namespace cwg432
650 
651 namespace cwg433 { // cwg433: 2.7
652   template<class T> struct S {
653     void f(union U*);
654   };
655   U *p;
656   template<class T> void S<T>::f(union U*) {}
657 
658   S<int> s;
659 } // namespace cwg433
660 
661 namespace cwg434 { // cwg434: sup 2352
662   void f() {
663     const int ci = 0;
664     int *pi = 0;
665     const int *&rpci = pi;
666     // expected-error@-1 {{binding reference of type 'const int *' to value of type 'int *' not permitted due to incompatible qualifiers}}
667     const int * const &rcpci = pi; // OK
668     rpci = &ci;
669     *pi = 1;
670   }
671 
672 #if __cplusplus >= 201103L
673   int *pi = 0;
674   const int * const &rcpci = pi;
675   static_assert(&rcpci == &pi, "");
676 #endif
677 } // namespace cwg434
678 
679 // cwg435: na
680 
681 namespace cwg436 { // cwg436: 2.7
682   enum E { f }; // #cwg436-f
683   void f();
684   // expected-error@-1 {{redefinition of 'f' as different kind of symbol}}
685   //   expected-note@#cwg436-f {{previous definition is here}}
686 } // namespace cwg436
687 
688 namespace cwg437 { // cwg437: sup 1308
689   // This is superseded by 1308, which is in turn superseded by 1330,
690   // which restores this rule.
691   template<typename U> struct T : U {};
692   struct S {
693     void f() throw(S);
694     // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}}
695     //   since-cxx17-note@-2 {{use 'noexcept(false)' instead}}
696     void g() throw(T<S>);
697     // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}}
698     //   since-cxx17-note@-2 {{use 'noexcept(false)' instead}}
699     struct U;
700     void h() throw(U);
701     // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}}
702     //   since-cxx17-note@-2 {{use 'noexcept(false)' instead}}
703     struct U {};
704   };
705 } // namespace cwg437
706 
707 // cwg438 is in cwg438.cpp
708 // cwg439 is in cwg439.cpp
709 // cwg441 is in cwg441.cpp
710 // cwg442: sup 348
711 // cwg443: na
712 
713 namespace cwg444 { // cwg444: 2.7
714   struct D;
715   struct B { // #cwg444-B
716     D &operator=(D &) = delete; // #cwg444-deleted
717     // cxx98-error@-1 {{deleted function definitions are a C++11 extension}}
718   };
719   struct D : B { // #cwg444-D
720     using B::operator=;
721   } extern d;
722   void f() {
723     d = d;
724     // expected-error@-1 {{overload resolution selected deleted operator '='}}
725     //   expected-note@#cwg444-deleted {{candidate function has been explicitly deleted}}
726     //   expected-note@#cwg444-D {{candidate function (the implicit copy assignment operator)}}
727     //   expected-note@#cwg444-B {{candidate function (the implicit copy assignment operator)}}
728     //   since-cxx11-note@#cwg444-B {{candidate function (the implicit move assignment operator) not viable: expects an rvalue for 1st argument}}
729     //   since-cxx11-note@#cwg444-D {{candidate function (the implicit move assignment operator) not viable: expects an rvalue for 1st argument}}
730   }
731 } // namespace cwg444
732 
733 namespace cwg445 { // cwg445: 3.2
734   class A { void f(); }; // #cwg445-f
735   struct B {
736     friend void A::f();
737     // expected-error@-1 {{friend function 'f' is a private member of 'cwg445::A'}}
738     //   expected-note@#cwg445-f {{implicitly declared private here}}
739   };
740 } // namespace cwg445
741 
742 namespace cwg446 { // cwg446: 2.8
743   struct C;
744   struct A {
745     A();
746     A(const A&) = delete; // #cwg446-deleted
747     // cxx98-error@-1 {{deleted function definitions are a C++11 extension}}
748     A(const C&);
749   };
750   struct C : A {};
751   void f(A a, bool b, C c) {
752     void(b ? a : a);
753     b ? A() : a;
754     // expected-error@-1 {{call to deleted constructor of 'A'}}
755     //   expected-note@#cwg446-deleted {{'A' has been explicitly marked deleted here}}
756     b ? a : A();
757     // expected-error@-1 {{call to deleted constructor of 'A'}}
758     //   expected-note@#cwg446-deleted {{'A' has been explicitly marked deleted here}}
759     b ? A() : A();
760     // cxx98-14-error@-1 {{call to deleted constructor of 'A'}}
761     //   expected-note@#cwg446-deleted {{'A' has been explicitly marked deleted here}}
762 
763     void(b ? a : c);
764     b ? a : C();
765     // expected-error@-1 {{call to deleted constructor of 'A'}}
766     //   cxx98-14-note@#cwg446-deleted {{'A' has been explicitly marked deleted here}}
767     b ? c : A();
768     // cxx98-14-error@-1 {{call to deleted constructor of 'A'}}
769     //   cxx98-14-note@#cwg446-deleted {{'A' has been explicitly marked deleted here}}
770     b ? A() : C();
771     // cxx98-14-error@-1 {{call to deleted constructor of 'A'}}
772     //   cxx98-14-note@#cwg446-deleted {{'A' has been explicitly marked deleted here}}
773   }
774 } // namespace cwg446
775 
776 namespace cwg447 { // cwg447: 2.8
777   struct A { int n; int a[4]; };
778   template<int> struct U {
779     typedef int type;
780     template<typename V> static void h();
781   };
782   template<typename T> U<sizeof(T)> g(T);
783   template<typename T, int N> void f(int n) {
784     // ok, not type dependent
785     g(__builtin_offsetof(A, n)).h<int>();
786     g(__builtin_offsetof(T, n)).h<int>();
787     // value dependent if first argument is a dependent type
788     U<__builtin_offsetof(A, n)>::type a;
789     // FIXME: instead of ";", we should be suggesting "typename"
790     U<__builtin_offsetof(T, n)>::type b;
791     // expected-error@-1 {{expected ';' after expression}}
792     // expected-error@-2 {{use of undeclared identifier 'b'}}
793     // as an extension, we allow the member-designator to include array indices
794     g(__builtin_offsetof(A, a[0])).h<int>();
795     g(__builtin_offsetof(A, a[N])).h<int>();
796     U<__builtin_offsetof(A, a[0])>::type c;
797     // FIXME: instead of ";", we should be suggesting "typename"
798     U<__builtin_offsetof(A, a[N])>::type d;
799     // expected-error@-1 {{expected ';' after expression}}
800     // expected-error@-2 {{use of undeclared identifier 'd'}}
801   }
802 } // namespace cwg447
803 
804 namespace cwg448 { // cwg448: 2.8
805   template<typename T = int> void f(int); // #cwg448-f-int
806   // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}}
807   template<typename T> void g(T t) {
808     f<T>(t);
809     // expected-error@-1 {{call to function 'f' that is neither visible in the template definition nor found by argument-dependent lookup}}
810     //   expected-note@#cwg448-g {{in instantiation of function template specialization 'cwg448::g<cwg448::HideFromADL::X>' requested here}}
811     //   expected-note@#cwg448-f-T {{'f' should be declared prior to the call site or in namespace 'cwg448::HideFromADL'}}
812     cwg448::f(t);
813     // expected-error@-1 {{no matching function for call to 'f'}}
814     //   expected-note@#cwg448-f-int {{candidate function template not viable: no known conversion from 'cwg448::HideFromADL::X' to 'int' for 1st argument}}
815   }
816   template<typename T> void f(T); // #cwg448-f-T
817   namespace HideFromADL { struct X {}; }
818   template void g(int); // ok
819   template void g(HideFromADL::X); // #cwg448-g
820 } // namespace cwg448
821 
822 // cwg449: na
823 
824 namespace cwg450 { // cwg450: 3.2
825   typedef int A[3];
826   void f1(const A &);
827   void f2(A &); // #cwg450-f2
828   struct S { A n; };
829   void g() {
830     f1(S().n);
831     f2(S().n);
832     // expected-error@-1 {{no matching function for call to 'f2'}}}
833     //   expected-note@#cwg450-f2 {{candidate function not viable: expects an lvalue for 1st argument}}
834   }
835 #if __cplusplus >= 201103L
836   void h() {
837     f1(A{});
838     f2(A{});
839     // since-cxx11-error@-1 {{no matching function for call to 'f2'}}}
840     //   since-cxx11-note@#cwg450-f2 {{candidate function not viable: expects an lvalue for 1st argument}}
841   }
842 #endif
843 } // namespace cwg450
844 
845 namespace cwg451 { // cwg451: 2.7
846   const int a = 1 / 0;
847   // expected-warning@-1 {{division by zero is undefined}}
848   const int b = 1 / 0; // #cwg451-b
849   // expected-warning@-1 {{division by zero is undefined}}
850   static_assert(b, "");
851   // expected-error@-1 {{expression is not an integral constant expression}}
852   //   expected-note@-2 {{initializer of 'b' is not a constant expression}}
853   //   expected-note@#cwg451-b {{declared here}}
854 } // namespace cwg451
855 
856 namespace cwg452 { // cwg452: 2.7
857   struct A {
858     int a, b, c;
859     A *p;
860     int f();
861     A() : a(f()), b(this->f() + a), c(this->a), p(this) {}
862   };
863 } // namespace cwg452
864 
865 // cwg454 FIXME write a codegen test
866 
867 namespace cwg456 { // cwg456: 3.4
868   // sup 903 c++11
869   const int null = 0;
870   void *p = null;
871   // cxx98-warning@-1 {{expression which evaluates to zero treated as a null pointer constant of type 'void *'}}
872   // since-cxx11-error@-2 {{cannot initialize a variable of type 'void *' with an lvalue of type 'const int'}}
873 
874   const bool f = false;
875   void *q = f;
876   // cxx98-warning@-1 {{initialization of pointer of type 'void *' to null from a constant boolean}}
877   // since-cxx11-error@-2 {{cannot initialize a variable of type 'void *' with an lvalue of type 'const bool'}}
878 } // namespace cwg456
879 
880 namespace cwg457 { // cwg457: 2.7
881   const int a = 1;
882   const volatile int b = 1;
883   static_assert(a, "");
884   static_assert(b, "");
885   // expected-error@-1 {{expression is not an integral constant expression}}
886   //   expected-note@-2 {{read of volatile-qualified type 'const volatile int' is not allowed in a constant expression}}
887 
888   enum E {
889     ea = a,
890     eb = b
891     // expected-error@-1 {{expression is not an integral constant expression}}
892     //   expected-note@-2 {{read of volatile-qualified type 'const volatile int' is not allowed in a constant expression}}
893   };
894 } // namespace cwg457
895 
896 namespace cwg458 { // cwg458: 11
897   struct A {
898     int T;
899     int f();
900     template<typename> int g();
901   };
902 
903   template<typename> struct B : A {
904     int f();
905     template<typename> int g();
906     template<typename> int h();
907   };
908 
909   int A::f() {
910     return T;
911   }
912   template<typename T> // #cwg458-g-T
913   int A::g() {
914     return T;
915     // expected-error@-1 {{'T' does not refer to a value}}
916     //   expected-note@#cwg458-g-T {{declared here}}
917   }
918 
919   template<typename T>
920   int B<T>::f() {
921     return T;
922   }
923   template<typename T>
924   template<typename U>
925   int B<T>::g() {
926     return T;
927   }
928   template<typename U>
929   template<typename T> // #cwg458-h-T
930   int B<U>::h() {
931     return T;
932     // expected-error@-1 {{'T' does not refer to a value}}
933     //   expected-note@#cwg458-h-T {{declared here}}
934   }
935 } // namespace cwg458
936 
937 namespace cwg460 { // cwg460: 2.7
938   namespace X { namespace Q { int n; } }
939   namespace Y {
940     using X;
941     // expected-error@-1 {{using declaration requires a qualified name}}
942     using cwg460::X;
943     // expected-error@-1 {{using declaration cannot refer to a namespace}}
944     // expected-note@-2 {{did you mean 'using namespace'?}}
945     using X::Q;
946     // expected-error@-1 {{using declaration cannot refer to a namespace}}
947     // expected-note@-2 {{did you mean 'using namespace'?}}
948   }
949 } // namespace cwg460
950 
951 // cwg461: na
952 // cwg462 is in cwg462.cpp
953 // cwg463: na
954 // cwg464: na
955 // cwg465: na
956 
957 namespace cwg466 { // cwg466: 2.8
958 typedef int I;
959 typedef const int CI;
960 typedef volatile int VI;
961 void g(int a, CI b, VI c) {
962 // since-cxx20-warning@-1 {{volatile-qualified parameter type 'VI' (aka 'volatile int') is deprecated}}
963   a.~I();
964   a.~CI();
965   a.~VI();
966   a.I::~I();
967   a.CI::~CI();
968   a.VI::~VI();
969 
970   a.CI::~VI(); // allowed by changes to [expr.id.prim.qual]/2 introduced in P1131R2
971 
972   b.~I();
973   b.~CI();
974   b.~VI();
975   b.I::~I();
976   b.CI::~CI();
977   b.VI::~VI();
978 
979   c.~I();
980   c.~CI();
981   c.~VI();
982   c.I::~I();
983   c.CI::~CI();
984   c.VI::~VI();
985 }
986 } // namespace cwg466
987 
988 namespace cwg467 { // cwg467: 2.7
989   int stuff();
990 
991   int f() {
992     static bool done;
993     if (done)
994       goto later;
995     static int k = stuff();
996     done = true;
997   later:
998     return k;
999   }
1000   int g() {
1001     goto later;
1002     // expected-error@-1 {{cannot jump from this goto statement to its label}}
1003     //   expected-note@#cwg467-k {{jump bypasses variable initialization}}
1004     int k = stuff(); // #cwg467-k
1005   later:
1006     return k;
1007   }
1008 } // namespace cwg467
1009 
1010 namespace cwg468 { // cwg468: 2.7 c++11
1011   // FIXME: Should we allow this in C++98 too?
1012   template<typename> struct A {
1013     template<typename> struct B {
1014       static int C;
1015     };
1016   };
1017   int k = cwg468::template A<int>::template B<char>::C;
1018   // cxx98-error@-1 {{'template' keyword outside of a template}}
1019   // cxx98-error@-2 {{'template' keyword outside of a template}}
1020 } // namespace cwg468
1021 
1022 namespace cwg469 { // cwg469: no
1023   template<typename T> struct X; // #cwg469-X
1024   template<typename T> struct X<const T> {};
1025   X<int&> x;
1026   // expected-error@-1 {{implicit instantiation of undefined template 'cwg469::X<int &>'}}
1027   //   expected-note@#cwg469-X {{template is declared here}}
1028 } // namespace cwg469
1029 
1030 namespace cwg470 { // cwg470: 2.7
1031   template<typename T> struct A {
1032     struct B {};
1033   };
1034   template<typename T> struct C {
1035   };
1036 
1037   template struct A<int>; // #cwg470-A-int
1038   template struct A<int>::B;
1039   // expected-error@-1 {{duplicate explicit instantiation of 'B'}}
1040   //   expected-note@#cwg470-A-int {{previous explicit instantiation is here}}
1041 
1042   // ok, instantiating C<char> doesn't instantiate base class members.
1043   template struct A<char>;
1044   template struct C<char>;
1045 } // namespace cwg470
1046 
1047 namespace cwg471 { // cwg471: 2.8
1048   struct A { int n; };
1049   struct B : private virtual A {};
1050   struct C : protected virtual A {};
1051   struct D : B, C { int f() { return n; } };
1052   struct E : private virtual A {
1053     using A::n;
1054   };
1055   struct F : E, B { int f() { return n; } };
1056   struct G : virtual A {
1057   private:
1058     using A::n; // #cwg471-G-using
1059   };
1060   struct H : B, G { int f() { return n; } };
1061   // expected-error@-1 {{'n' is a private member of 'cwg471::G'}}
1062   //   expected-note@#cwg471-G-using {{declared private here}}
1063 } // namespace cwg471
1064 
1065 namespace cwg472 { // cwg472: no drafting 2011-04
1066 struct B {
1067   int i; // #cwg472-i
1068 };
1069 struct I : protected B {}; // #cwg472-struct-I
1070 struct D : public I {
1071   void f(I *ip) {
1072     ip->i = 0;
1073     // expected-error@-1 {{'i' is a protected member of 'cwg472::B'}}
1074     //   expected-note@#cwg472-struct-I {{constrained by protected inheritance here}}
1075     //   expected-note@#cwg472-i {{member is declared here}}
1076     B *bp = ip;
1077     bp->i = 5;
1078   }
1079 };
1080 } // namespace cwg472
1081 
1082 namespace cwg474 { // cwg474: 3.4
1083   namespace N {
1084     struct S {
1085       void f();
1086     };
1087   }
1088   void N::S::f() {
1089     void g(); // #cwg474-g
1090   }
1091   int g();
1092   namespace N {
1093     int g();
1094     // expected-error@-1 {{functions that differ only in their return type cannot be overloaded}}
1095     //   expected-note@#cwg474-g {{previous declaration is here}}
1096   }
1097 } // namespace cwg474
1098 
1099 // cwg475 FIXME write a libc++abi test
1100 
1101 namespace cwg477 { // cwg477: 3.5
1102   struct A {
1103     explicit A();
1104     virtual void f();
1105   };
1106   struct B {
1107     friend explicit A::A();
1108     // expected-error@-1 {{'explicit' is invalid in friend declarations}}
1109     friend virtual void A::f();
1110     // expected-error@-1 {{'virtual' is invalid in friend declarations}}
1111   };
1112   explicit A::A() {}
1113   // expected-error@-1 {{can only be specified inside the class definition}}
1114   virtual void A::f() {}
1115   // expected-error@-1 {{can only be specified inside the class definition}}
1116 } // namespace cwg477
1117 
1118 namespace cwg478 { // cwg478: 2.7
1119   struct A { virtual void f() = 0; }; // #cwg478-f
1120   void f(A *a);
1121   void f(A a[10]);
1122   // expected-error@-1 {{array of abstract class type 'A'}}
1123   //   expected-note@#cwg478-f {{unimplemented pure virtual method 'f' in 'A'}}
1124 } // namespace cwg478
1125 
1126 namespace cwg479 { // cwg479: 2.8
1127   struct S {
1128     S();
1129   private:
1130     S(const S&); // #cwg479-S-copy-ctor
1131     ~S(); // #cwg479-S-dtor
1132   };
1133   void f() {
1134     throw S();
1135     // expected-error@-1 {{temporary of type 'S' has private destructor}}
1136     //   expected-note@#cwg479-S-dtor {{declared private here}}
1137     // expected-error@-3 {{exception object of type 'S' has private destructor}}
1138     //   expected-note@#cwg479-S-dtor {{declared private here}}
1139     // cxx98-error@-5 {{C++98 requires an accessible copy constructor for class 'cwg479::S' when binding a reference to a temporary; was private}}
1140     //   cxx98-note@#cwg479-S-copy-ctor {{declared private here}}
1141     // cxx98-14-error@-7 {{calling a private constructor of class 'cwg479::S'}}
1142     //   cxx98-14-note@#cwg479-S-copy-ctor {{declared private here}}
1143   }
1144   void g() {
1145     S s;
1146     // expected-error@-1 {{variable of type 'S' has private destructor}}
1147     //   expected-note@#cwg479-S-dtor {{declared private here}}
1148     throw s;
1149     // expected-error@-1 {{exception object of type 'S' has private destructor}}
1150     //   expected-note@#cwg479-S-dtor {{declared private here}}
1151     // expected-error@-3 {{calling a private constructor of class 'cwg479::S'}}
1152     //   expected-note@#cwg479-S-copy-ctor {{declared private here}}
1153   }
1154   void h() {
1155     try {
1156       f();
1157       g();
1158     } catch (S s) {
1159       // expected-error@-1 {{calling a private constructor of class 'cwg479::S'}}
1160       //   expected-note@#cwg479-S-copy-ctor {{declared private here}}
1161       // expected-error@-3 {{variable of type 'S' has private destructor}}
1162       //   expected-note@#cwg479-S-dtor {{declared private here}}
1163     }
1164   }
1165 } // namespace cwg479
1166 
1167 namespace cwg480 { // cwg480: 2.7
1168   struct A { int n; };
1169   struct B : A {};
1170   struct C : virtual B {};
1171   struct D : C {};
1172 
1173   int A::*a = &A::n;
1174   int D::*b = a;
1175   // expected-error@-1 {{conversion from pointer to member of class 'A' to pointer to member of class 'D' via virtual base 'cwg480::B' is not allowed}}
1176 
1177   extern int D::*c;
1178   int A::*d = static_cast<int A::*>(c);
1179   // expected-error@-1 {{conversion from pointer to member of class 'cwg480::D' to pointer to member of class 'A' via virtual base 'cwg480::B' is not allowed}}
1180 
1181   D *e;
1182   A *f = e;
1183   D *g = static_cast<D*>(f);
1184   // expected-error@-1 {{cannot cast 'cwg480::A *' to 'D *' via virtual base 'cwg480::B'}}
1185 
1186   extern D &i;
1187   A &j = i;
1188   D &k = static_cast<D&>(j);
1189   // expected-error@-1 {{cannot cast 'A' to 'D &' via virtual base 'cwg480::B'}}
1190 } // namespace cwg480
1191 
1192 namespace cwg481 { // cwg481: 2.8
1193   template<class T, T U> class A { T *x; };
1194   T *x;
1195   // expected-error@-1 {{unknown type name 'T'}}
1196 
1197   template<class T *U> class B { T *x; };
1198   T *y; // ok
1199 
1200   struct C {
1201     template<class T> void f(class D *p);
1202   };
1203   D *z; // ok
1204 
1205   template<typename A = C, typename C = A> struct E {
1206     void f() {
1207       typedef ::cwg481::C c; // #cwg481-c
1208       typedef C c;
1209       // expected-error@-1 {{typedef redefinition with different types ('int' vs '::cwg481::C')}}
1210       //   expected-note@#cwg481-E-int {{in instantiation of member function 'cwg481::E<int>::f' requested here}}
1211       //   expected-note@#cwg481-c {{previous definition is here}}
1212     }
1213   };
1214   template struct E<>; // ok
1215   template struct E<int>; // #cwg481-E-int
1216 
1217   template<template<typename U_no_typo_correction> class A,
1218            A<int> *B,
1219            U_no_typo_correction *C>
1220            // expected-error@-1 {{unknown type name 'U_no_typo_correction'}}
1221   struct F {
1222     U_no_typo_correction *x;
1223     // expected-error@-1 {{unknown type name 'U_no_typo_correction'}}
1224   };
1225 
1226   template<template<class H *> class> struct G {
1227     H *x;
1228   };
1229   H *q;
1230 
1231   typedef int N;
1232   template<N X, typename N, template<N Y> class T> struct I;
1233   template<char*> struct J;
1234   I<123, char*, J> *j;
1235 } // namespace cwg481
1236 
1237 namespace cwg482 { // cwg482: 3.5
1238   extern int a;
1239   void f();
1240 
1241   int cwg482::a = 0;
1242   // expected-warning@-1 {{extra qualification on member 'a'}}
1243   void cwg482::f() {}
1244   // expected-warning@-1 {{extra qualification on member 'f'}}
1245 
1246   inline namespace X {
1247   // cxx98-error@-1 {{inline namespaces are a C++11 feature}}
1248     extern int b;
1249     void g();
1250     struct S;
1251   }
1252   int cwg482::b = 0;
1253   // expected-warning@-1 {{extra qualification on member 'b'}}
1254   void cwg482::g() {}
1255   // expected-warning@-1 {{extra qualification on member 'g'}}
1256   struct cwg482::S {};
1257   // expected-warning@-1 {{extra qualification on member 'S'}}
1258 
1259   void cwg482::f();
1260   // expected-warning@-1 {{extra qualification on member 'f'}}
1261   void cwg482::g();
1262   // expected-warning@-1 {{extra qualification on member 'g'}}
1263 
1264   // FIXME: The following are valid in CWG482's wording, but these are bugs in
1265   // the wording which we deliberately don't implement.
1266   namespace N { typedef int type; }
1267   typedef int N::type;
1268   // expected-error@-1 {{typedef declarator cannot be qualified}}
1269   struct A {
1270     struct B;
1271     struct A::B {};
1272     // expected-error@-1 {{extra qualification on member 'B'}}
1273 
1274 #if __cplusplus >= 201103L
1275     enum class C;
1276     enum class A::C {};
1277     // since-cxx11-error@-1 {{extra qualification on member 'C'}}
1278 #endif
1279   };
1280 } // namespace cwg482
1281 
1282 namespace cwg483 { // cwg483: 2.7
1283   namespace climits {
1284     static_assert(__SCHAR_MAX__ >= 127, "");
1285     static_assert(__SHRT_MAX__ >= 32767, "");
1286     static_assert(__INT_MAX__ >= 32767, "");
1287     static_assert(__LONG_MAX__ >= 2147483647, "");
1288     static_assert(__LONG_LONG_MAX__ >= 9223372036854775807, "");
1289   }
1290   namespace cstdint {
1291     static_assert(__PTRDIFF_WIDTH__ >= 16, "");
1292     static_assert(__SIG_ATOMIC_WIDTH__ >= 8, "");
1293     static_assert(__SIZE_WIDTH__ >= 16, "");
1294     static_assert(__WCHAR_WIDTH__ >= 8, "");
1295     static_assert(__WINT_WIDTH__ >= 16, "");
1296   }
1297 } // namespace cwg483
1298 
1299 namespace cwg484 { // cwg484: 2.8
1300   struct A {
1301     A();
1302     void f();
1303   };
1304   typedef const A CA;
1305   void CA::f() {
1306     this->~CA();
1307     this->CA::~A();
1308     this->CA::A::~A();
1309   }
1310   CA::A() {}
1311 
1312   struct B : CA {
1313     B() : CA() {}
1314     void f() { return CA::f(); }
1315   };
1316 
1317   struct C;
1318   typedef C CT; // #cwg484-typedef-CT
1319   struct CT {};
1320   // expected-error@-1 {{definition of type 'CT' conflicts with typedef of the same name}}
1321   //   expected-note@#cwg484-typedef-CT {{'CT' declared here}}
1322 
1323   namespace N {
1324     struct D;
1325     typedef D DT; // #cwg484-typedef-DT
1326   }
1327   struct N::DT {};
1328   // expected-error@-1 {{definition of type 'DT' conflicts with typedef of the same name}}
1329   //   expected-note@#cwg484-typedef-DT {{'DT' declared here}}
1330 
1331   typedef struct {
1332     S();
1333     // expected-error@-1 {{a type specifier is required for all declarations}}
1334   } S;
1335 } // namespace cwg484
1336 
1337 namespace cwg485 { // cwg485: 2.7
1338   namespace N {
1339     struct S {};
1340     int operator+(S, S);
1341     template<typename T> int f(S);
1342   }
1343   template<typename T> int f();
1344 
1345   N::S s;
1346   int a = operator+(s, s);
1347   int b = f<int>(s);
1348 } // namespace cwg485
1349 
1350 namespace cwg486 { // cwg486: 2.7
1351   template<typename T> T f(T *); // #cwg486-f
1352   int &f(...);
1353 
1354   void g();
1355   int n[10];
1356 
1357   void h() {
1358     int &a = f(&g);
1359     int &b = f(&n);
1360     f<void()>(&g);
1361     // expected-error@-1 {{no matching function for call to 'f'}}
1362     //   expected-note@#cwg486-f {{candidate template ignored: substitution failure [with T = void ()]: function cannot return function type 'void ()'}}
1363     f<int[10]>(&n);
1364     // expected-error@-1 {{no matching function for call to 'f'}}
1365     //   expected-note@#cwg486-f {{candidate template ignored: substitution failure [with T = int[10]]: function cannot return array type 'int[10]'}}
1366   }
1367 } // namespace cwg486
1368 
1369 namespace cwg487 { // cwg487: 2.7
1370   enum E { e };
1371   int operator+(int, E); // #cwg487-operator-plus
1372   static_assert(4 + e, "");
1373   // expected-error@-1 {{expression is not an integral constant expression}}
1374   //   since-cxx11-note@-2 {{non-constexpr function 'operator+' cannot be used in a constant expression}}
1375   //   since-cxx11-note@#cwg487-operator-plus {{declared here}}
1376 } // namespace cwg487
1377 
1378 namespace cwg488 { // cwg488: 2.9 c++11
1379   template <typename T> void f(T);
1380   void f(int);
1381   void g() {
1382     // FIXME: It seems CWG thought this should be a SFINAE failure prior to
1383     // allowing local types as template arguments. In C++98, we should either
1384     // allow local types as template arguments or treat this as a SFINAE
1385     // failure.
1386     enum E { e };
1387     f(e);
1388     // cxx98-error@-1 {{template argument uses local type 'E'}}
1389   }
1390 } // namespace cwg488
1391 
1392 // cwg489: na
1393 
1394 namespace cwg490 { // cwg490: 2.8
1395   template<typename T> struct X {};
1396 
1397   struct A {
1398     typedef int T;
1399     struct K {}; // #cwg490-k
1400 
1401     int f(T);
1402     int g(T);
1403     int h(X<T>);
1404     int X<T>::*i(); // #cwg490-i
1405     int K::*j();
1406 
1407     template<typename T> T k();
1408 
1409     operator X<T>();
1410   };
1411 
1412   struct B {
1413     typedef char T;
1414     typedef int U;
1415     friend int A::f(T);
1416     friend int A::g(U);
1417     friend int A::h(X<T>);
1418 
1419     // FIXME: Per this DR, these two are valid! That is another defect
1420     // (no number yet...) which will eventually supersede this one.
1421     friend int X<T>::*A::i();
1422     // expected-error@-1 {{return type of out-of-line definition of 'cwg490::A::i' differs from that in the declaration}}
1423     //   expected-note@#cwg490-i {{previous declaration is here}}
1424     friend int K::*A::j();
1425     // expected-error@-1 {{use of undeclared identifier 'K'; did you mean 'A::K'?}}
1426     //   expected-note@#cwg490-k {{'A::K' declared here}}
1427 
1428     // ok, lookup finds B::T, not A::T, so return type matches
1429     friend char A::k<T>();
1430     friend int A::k<U>();
1431 
1432     // A conversion-type-id in a conversion-function-id is always looked up in
1433     // the class of the conversion function first.
1434     friend A::operator X<T>();
1435   };
1436 } // namespace cwg490
1437 
1438 namespace cwg491 { // cwg491: dup 413
1439   struct A {} a, b[3] = { a, {} };
1440   A c[2] = { a, {}, b[1] };
1441   // expected-error@-1 {{excess elements in array initializer}}
1442 } // namespace cwg491
1443 
1444 // cwg492 is in cwg492.cpp
1445 
1446 namespace cwg493 { // cwg493: dup 976
1447   struct X {
1448     template <class T> operator const T &() const;
1449   };
1450   void f() {
1451     if (X()) {
1452     }
1453   }
1454 } // namespace cwg493
1455 
1456 namespace cwg494 { // cwg494: dup 372
1457   class A {
1458     class B {};
1459     friend class C;
1460   };
1461   class C : A::B {
1462     A::B x;
1463     class D : A::B {
1464       A::B y;
1465     };
1466   };
1467 } // namespace cwg494
1468 
1469 namespace cwg495 { // cwg495: 3.5
1470   template<typename T>
1471   struct S {
1472     operator int() { return T::error; }
1473     template<typename U> operator U();
1474   };
1475   S<int> s;
1476   long n = s;
1477 
1478   template<typename T>
1479   struct S2 {
1480     template<typename U> operator U();
1481     operator int() { return T::error; }
1482   };
1483   S2<int> s2;
1484   long n2 = s2;
1485 } // namespace cwg495
1486 
1487 namespace cwg496 { // cwg496: sup 2094
1488   struct A { int n; };
1489   struct B { volatile int n; };
1490   static_assert(__is_trivially_copyable(const int), "");
1491   // This checks the cwg2094 behavior, not cwg496
1492   static_assert(__is_trivially_copyable(volatile int), "");
1493   static_assert(__is_trivially_constructible(A, const A&), "");
1494   static_assert(__is_trivially_constructible(B, const B&), "");
1495   static_assert(__is_trivially_assignable(A, const A&), "");
1496   static_assert(__is_trivially_assignable(B, const B&), "");
1497 } // namespace cwg496
1498 
1499 namespace cwg497 { // cwg497: sup 253
1500   void before() {
1501     struct S {
1502       mutable int i;
1503     };
1504     const S cs;
1505     int S::*pm = &S::i;
1506     cs.*pm = 88;
1507     // expected-error@-1 {{read-only variable is not assignable}}
1508   }
1509 
1510   void after() {
1511     struct S {
1512       S() : i(0) {}
1513       mutable int i;
1514     };
1515     const S cs;
1516     int S::*pm = &S::i;
1517     cs.*pm = 88;
1518     // expected-error@-1 {{read-only variable is not assignable}}
1519   }
1520 } // namespace cwg497
1521 
1522 namespace cwg499 { // cwg499: 2.7
1523   extern char str[];
1524   void f() { throw str; }
1525 } // namespace cwg499
1526