xref: /llvm-project/clang/test/CXX/drs/cwg0xx.cpp (revision e29c085812e259910a3d8b6c2d2f471d1c3eede4)
13c5f2698SVlad Serebrennikov // RUN: %clang_cc1 -std=c++98 %s -verify=expected,cxx98,cxx98-14 -fexceptions -fcxx-exceptions -pedantic-errors
2d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++11 %s -verify=expected,since-cxx11,cxx98-14,cxx11-14 -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple
3d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++14 %s -verify=expected,since-cxx11,cxx98-14,cxx11-14 -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple
4d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++17 %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple
5d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++20 %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple
6d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++23 %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple
7327e2b7cSVlad Serebrennikov // RUN: %clang_cc1 -std=c++2c %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple
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 namespace cwg1 { // cwg1: no
15d358b2deSVlad Serebrennikov   namespace X { extern "C" void cwg1_f(int a = 1); }
16d358b2deSVlad Serebrennikov   namespace Y { extern "C" void cwg1_f(int a = 1); }
17d358b2deSVlad Serebrennikov   using X::cwg1_f; using Y::cwg1_f;
18d358b2deSVlad Serebrennikov   void g() {
19d358b2deSVlad Serebrennikov     cwg1_f(0);
20d358b2deSVlad Serebrennikov     // FIXME: This should be rejected, due to the ambiguous default argument.
21d358b2deSVlad Serebrennikov     cwg1_f();
22d358b2deSVlad Serebrennikov   }
23d358b2deSVlad Serebrennikov   namespace X {
24d358b2deSVlad Serebrennikov     using Y::cwg1_f;
25d358b2deSVlad Serebrennikov     void h() {
26d358b2deSVlad Serebrennikov       cwg1_f(0);
27d358b2deSVlad Serebrennikov       // FIXME: This should be rejected, due to the ambiguous default argument.
28d358b2deSVlad Serebrennikov       cwg1_f();
29d358b2deSVlad Serebrennikov     }
30d358b2deSVlad Serebrennikov   }
31d358b2deSVlad Serebrennikov 
32d358b2deSVlad Serebrennikov   namespace X {
33d358b2deSVlad Serebrennikov     void z(int);
34d358b2deSVlad Serebrennikov   }
35d358b2deSVlad Serebrennikov   void X::z(int = 1) {} // #cwg1-z
36d358b2deSVlad Serebrennikov   namespace X {
37d358b2deSVlad Serebrennikov     void z(int = 1);
38d358b2deSVlad Serebrennikov     // expected-error@-1 {{redefinition of default argument}}
39d358b2deSVlad Serebrennikov     //   expected-note@#cwg1-z {{previous definition is here}}
40d358b2deSVlad Serebrennikov   }
41d358b2deSVlad Serebrennikov 
42d358b2deSVlad Serebrennikov   void i(int = 1);
43d358b2deSVlad Serebrennikov   void j() {
44d358b2deSVlad Serebrennikov     void i(int = 1);
45d358b2deSVlad Serebrennikov     using cwg1::i;
46d358b2deSVlad Serebrennikov     i(0);
47d358b2deSVlad Serebrennikov     // FIXME: This should be rejected, due to the ambiguous default argument.
48d358b2deSVlad Serebrennikov     i();
49d358b2deSVlad Serebrennikov   }
50d358b2deSVlad Serebrennikov   void k() {
51d358b2deSVlad Serebrennikov     using cwg1::i;
52d358b2deSVlad Serebrennikov     void i(int = 1);
53d358b2deSVlad Serebrennikov     i(0);
54d358b2deSVlad Serebrennikov     // FIXME: This should be rejected, due to the ambiguous default argument.
55d358b2deSVlad Serebrennikov     i();
56d358b2deSVlad Serebrennikov   }
57463e61a0SVlad Serebrennikov } // namespace cwg1
58d358b2deSVlad Serebrennikov 
5914ba3f9dSVlad Serebrennikov namespace cwg3 { // cwg3: 2.7
60d358b2deSVlad Serebrennikov   template<typename T> struct A {};
61d358b2deSVlad Serebrennikov   template<typename T> void f(T) { A<T> a; } // #cwg3-f-T
62d358b2deSVlad Serebrennikov   template void f(int);
63d358b2deSVlad Serebrennikov   template<> struct A<int> {};
64d358b2deSVlad Serebrennikov   // expected-error@-1 {{explicit specialization of 'cwg3::A<int>' after instantiation}}
65d358b2deSVlad Serebrennikov   //   expected-note@#cwg3-f-T {{implicit instantiation first required here}}
66463e61a0SVlad Serebrennikov } // namespace cwg3
67d358b2deSVlad Serebrennikov 
68d358b2deSVlad Serebrennikov namespace cwg4 { // cwg4: 2.8
69d358b2deSVlad Serebrennikov   extern "C" {
70d358b2deSVlad Serebrennikov     static void cwg4_f(int) {}
71d358b2deSVlad Serebrennikov     static void cwg4_f(float) {}
72d358b2deSVlad Serebrennikov     void cwg4_g(int) {} // #cwg4-g-int
73d358b2deSVlad Serebrennikov     void cwg4_g(float) {}
74d358b2deSVlad Serebrennikov     // expected-error@-1 {{conflicting types for 'cwg4_g'}}
75d358b2deSVlad Serebrennikov     //   expected-note@#cwg4-g-int {{previous definition is here}}
76d358b2deSVlad Serebrennikov   }
77463e61a0SVlad Serebrennikov } // namespace cwg4
78d358b2deSVlad Serebrennikov 
79d358b2deSVlad Serebrennikov namespace cwg5 { // cwg5: 3.1
80d358b2deSVlad Serebrennikov   struct A {} a;
81d358b2deSVlad Serebrennikov   struct B {
82d358b2deSVlad Serebrennikov     B(const A&);
83d358b2deSVlad Serebrennikov     B(const B&);
84d358b2deSVlad Serebrennikov   };
85d358b2deSVlad Serebrennikov   const volatile B b = a;
86d358b2deSVlad Serebrennikov 
87d358b2deSVlad Serebrennikov   struct C { C(C&); };
88d358b2deSVlad Serebrennikov   struct D : C {};
89d358b2deSVlad Serebrennikov   struct E { operator D&(); } e;
90d358b2deSVlad Serebrennikov   const C c = e;
91463e61a0SVlad Serebrennikov } // namespace cwg5
92d358b2deSVlad Serebrennikov 
93d358b2deSVlad Serebrennikov namespace cwg7 { // cwg7: 3.4
94d358b2deSVlad Serebrennikov   class A { public: ~A(); };
95d358b2deSVlad Serebrennikov   class B : virtual private A {}; // #cwg7-B
96d358b2deSVlad Serebrennikov   class C : public B {} c; // #cwg7-C
97d358b2deSVlad Serebrennikov   // expected-error@#cwg7-C {{inherited virtual base class 'A' has private destructor}}
98d358b2deSVlad Serebrennikov   //   expected-note@#cwg7-C {{in implicit default constructor for 'cwg7::C' first required here}}
99d358b2deSVlad Serebrennikov   //   expected-note@#cwg7-B {{declared private here}}
100d358b2deSVlad Serebrennikov   // expected-error@#cwg7-C {{inherited virtual base class 'A' has private destructor}}
101d358b2deSVlad Serebrennikov   //   expected-note@#cwg7-C {{in implicit destructor for 'cwg7::C' first required here}}
102d358b2deSVlad Serebrennikov   //   expected-note@#cwg7-B {{declared private here}}
103d358b2deSVlad Serebrennikov   class VeryDerivedC : public B, virtual public A {} vdc;
104d358b2deSVlad Serebrennikov 
105d358b2deSVlad Serebrennikov   class X { ~X(); }; // #cwg7-X
106d358b2deSVlad Serebrennikov   class Y : X { ~Y() {} };
107d358b2deSVlad Serebrennikov   // expected-error@-1 {{base class 'X' has private destructor}}
108d358b2deSVlad Serebrennikov   //   expected-note@#cwg7-X {{implicitly declared private here}}
109d358b2deSVlad Serebrennikov 
110d358b2deSVlad Serebrennikov   namespace PR16370 { // This regressed the first time CWG7 was fixed.
111d358b2deSVlad Serebrennikov     struct S1 { virtual ~S1(); };
112d358b2deSVlad Serebrennikov     struct S2 : S1 {};
113d358b2deSVlad Serebrennikov     struct S3 : S2 {};
114d358b2deSVlad Serebrennikov     struct S4 : virtual S2 {};
115d358b2deSVlad Serebrennikov     struct S5 : S3, S4 {
116d358b2deSVlad Serebrennikov       S5();
117d358b2deSVlad Serebrennikov       ~S5();
118d358b2deSVlad Serebrennikov     };
119d358b2deSVlad Serebrennikov     S5::S5() {}
120d358b2deSVlad Serebrennikov   }
121463e61a0SVlad Serebrennikov } // namespace cwg7
122d358b2deSVlad Serebrennikov 
123d358b2deSVlad Serebrennikov namespace cwg8 { // cwg8: dup 45
124d358b2deSVlad Serebrennikov   class A {
125d358b2deSVlad Serebrennikov     struct U;
126d358b2deSVlad Serebrennikov     static const int k = 5;
127d358b2deSVlad Serebrennikov     void f();
128d358b2deSVlad Serebrennikov     template<typename, int, void (A::*)()> struct T;
129d358b2deSVlad Serebrennikov 
130d358b2deSVlad Serebrennikov     T<U, k, &A::f> *g();
131d358b2deSVlad Serebrennikov   };
132d358b2deSVlad Serebrennikov   A::T<A::U, A::k, &A::f> *A::g() { return 0; }
133463e61a0SVlad Serebrennikov } // namespace cwg8
134d358b2deSVlad Serebrennikov 
135d358b2deSVlad Serebrennikov namespace cwg9 { // cwg9: 2.8
136d358b2deSVlad Serebrennikov   struct B {
137d358b2deSVlad Serebrennikov   protected:
138d358b2deSVlad Serebrennikov     int m; // #cwg9-m
139d358b2deSVlad Serebrennikov     friend int R1();
140d358b2deSVlad Serebrennikov   };
141d358b2deSVlad Serebrennikov   struct N : protected B { // #cwg9-N
142d358b2deSVlad Serebrennikov     friend int R2();
143d358b2deSVlad Serebrennikov   } n;
144d358b2deSVlad Serebrennikov   int R1() { return n.m; }
145d358b2deSVlad Serebrennikov   // expected-error@-1 {{'m' is a protected member of 'cwg9::B'}}
146d358b2deSVlad Serebrennikov   //   expected-note@#cwg9-N {{constrained by protected inheritance here}}
147d358b2deSVlad Serebrennikov   //   expected-note@#cwg9-m {{member is declared here}}
148d358b2deSVlad Serebrennikov   int R2() { return n.m; }
149463e61a0SVlad Serebrennikov } // namespace cwg9
150d358b2deSVlad Serebrennikov 
151d358b2deSVlad Serebrennikov namespace cwg10 { // cwg10: dup 45
152d358b2deSVlad Serebrennikov   class A {
153d358b2deSVlad Serebrennikov     struct B {
154d358b2deSVlad Serebrennikov       A::B *p;
155d358b2deSVlad Serebrennikov     };
156d358b2deSVlad Serebrennikov   };
157463e61a0SVlad Serebrennikov } // namespace cwg10
158d358b2deSVlad Serebrennikov 
15914ba3f9dSVlad Serebrennikov namespace cwg11 { // cwg11: 2.7
160d358b2deSVlad Serebrennikov   template<typename T> struct A : T {
161d358b2deSVlad Serebrennikov     using typename T::U;
162d358b2deSVlad Serebrennikov     U u;
163d358b2deSVlad Serebrennikov   };
164d358b2deSVlad Serebrennikov   template<typename T> struct B : T {
165d358b2deSVlad Serebrennikov     using T::V;
166d358b2deSVlad Serebrennikov     V v;
167d358b2deSVlad Serebrennikov     // expected-error@-1 {{unknown type name 'V'}}
168d358b2deSVlad Serebrennikov   };
169d358b2deSVlad Serebrennikov   struct X { typedef int U; };
170d358b2deSVlad Serebrennikov   A<X> ax;
171463e61a0SVlad Serebrennikov } // namespace cwg11
172d358b2deSVlad Serebrennikov 
173d358b2deSVlad Serebrennikov namespace cwg12 { // cwg12: sup 239
174d358b2deSVlad Serebrennikov   enum E { e };
175d358b2deSVlad Serebrennikov   E &f(E, E = e);
176d358b2deSVlad Serebrennikov   void g() {
177d358b2deSVlad Serebrennikov     int &f(int, E = e);
178d358b2deSVlad Serebrennikov     // Under CWG12, these call two different functions.
179d358b2deSVlad Serebrennikov     // Under CWG239, they call the same function.
180d358b2deSVlad Serebrennikov     int &b = f(e);
181d358b2deSVlad Serebrennikov     int &c = f(1);
182d358b2deSVlad Serebrennikov   }
183463e61a0SVlad Serebrennikov } // namespace cwg12
184d358b2deSVlad Serebrennikov 
185d358b2deSVlad Serebrennikov namespace cwg13 { // cwg13: no
186d358b2deSVlad Serebrennikov   extern "C" void f(int);
187d358b2deSVlad Serebrennikov   void g(char);
188d358b2deSVlad Serebrennikov 
189d358b2deSVlad Serebrennikov   template<typename T> struct A {
190d358b2deSVlad Serebrennikov     A(void (*fp)(T));
191d358b2deSVlad Serebrennikov   };
192d358b2deSVlad Serebrennikov   template<typename T> int h(void (T));
193d358b2deSVlad Serebrennikov 
194d358b2deSVlad Serebrennikov   A<int> a1(f); // FIXME: We should reject this.
195d358b2deSVlad Serebrennikov   A<char> a2(g);
196d358b2deSVlad Serebrennikov   int a3 = h(f); // FIXME: We should reject this.
197d358b2deSVlad Serebrennikov   int a4 = h(g);
198463e61a0SVlad Serebrennikov } // namespace cwg13
199d358b2deSVlad Serebrennikov 
200d358b2deSVlad Serebrennikov namespace cwg14 { // cwg14: 3.4
201d358b2deSVlad Serebrennikov   namespace X { extern "C" int cwg14_f(); }
202d358b2deSVlad Serebrennikov   namespace Y { extern "C" int cwg14_f(); }
203d358b2deSVlad Serebrennikov   using namespace X;
204d358b2deSVlad Serebrennikov   using namespace Y;
205d358b2deSVlad Serebrennikov   int k = cwg14_f();
206d358b2deSVlad Serebrennikov 
207d358b2deSVlad Serebrennikov   class C {
208d358b2deSVlad Serebrennikov     int k;
209d358b2deSVlad Serebrennikov     friend int Y::cwg14_f();
210d358b2deSVlad Serebrennikov   } c;
211d358b2deSVlad Serebrennikov   namespace Z {
212d358b2deSVlad Serebrennikov     extern "C" int cwg14_f() { return c.k; }
213d358b2deSVlad Serebrennikov   }
214d358b2deSVlad Serebrennikov 
215d358b2deSVlad Serebrennikov   namespace X { typedef int T; typedef int U; } // #cwg14-X-U
216d358b2deSVlad Serebrennikov   namespace Y { typedef int T; typedef long U; } // #cwg14-Y-U
217d358b2deSVlad Serebrennikov   T t; // ok, same type both times
218d358b2deSVlad Serebrennikov   U u;
219d358b2deSVlad Serebrennikov   // expected-error@-1 {{reference to 'U' is ambiguous}}
220d358b2deSVlad Serebrennikov   //   expected-note@#cwg14-X-U {{candidate found by name lookup is 'cwg14::X::U'}}
221d358b2deSVlad Serebrennikov   //   expected-note@#cwg14-Y-U {{candidate found by name lookup is 'cwg14::Y::U'}}
222463e61a0SVlad Serebrennikov } // namespace cwg14
223d358b2deSVlad Serebrennikov 
22414ba3f9dSVlad Serebrennikov namespace cwg15 { // cwg15: 2.7
225d358b2deSVlad Serebrennikov   template<typename T> void f(int); // #cwg15-f-decl-first
226d358b2deSVlad Serebrennikov   template<typename T> void f(int = 0);
227d358b2deSVlad Serebrennikov   // expected-error@-1 {{default arguments cannot be added to a function template that has already been declared}}
228d358b2deSVlad Serebrennikov   //   expected-note@#cwg15-f-decl-first {{previous template declaration is here}}
229463e61a0SVlad Serebrennikov } // namespace cwg15
230d358b2deSVlad Serebrennikov 
231d358b2deSVlad Serebrennikov namespace cwg16 { // cwg16: 2.8
232d358b2deSVlad Serebrennikov   class A { // #cwg16-A
233d358b2deSVlad Serebrennikov     void f(); // #cwg16-A-f-decl
234d358b2deSVlad Serebrennikov     friend class C;
235d358b2deSVlad Serebrennikov   };
236d358b2deSVlad Serebrennikov   class B : A {}; // #cwg16-B
237d358b2deSVlad Serebrennikov   class C : B {
238d358b2deSVlad Serebrennikov     void g() {
239d358b2deSVlad Serebrennikov       f();
240d358b2deSVlad Serebrennikov       // expected-error@-1 {{'f' is a private member of 'cwg16::A'}}
241d358b2deSVlad Serebrennikov       //   expected-note@#cwg16-B {{constrained by implicitly private inheritance here}}
242d358b2deSVlad Serebrennikov       //   expected-note@#cwg16-A-f-decl {{member is declared here}}
243d358b2deSVlad Serebrennikov       A::f(); // #cwg16-A-f-call
244d358b2deSVlad Serebrennikov       // expected-error@#cwg16-A-f-call {{'A' is a private member of 'cwg16::A'}}
245d358b2deSVlad Serebrennikov       //   expected-note@#cwg16-B {{constrained by implicitly private inheritance here}}
246d358b2deSVlad Serebrennikov       //   expected-note@#cwg16-A {{member is declared here}}
247d358b2deSVlad Serebrennikov       // expected-error@#cwg16-A-f-call {{cannot cast 'cwg16::C' to its private base class 'cwg16::A'}}
248d358b2deSVlad Serebrennikov       //   expected-note@#cwg16-B {{implicitly declared private here}}
249d358b2deSVlad Serebrennikov     }
250d358b2deSVlad Serebrennikov   };
251463e61a0SVlad Serebrennikov } // namespace cwg16
252d358b2deSVlad Serebrennikov 
25314ba3f9dSVlad Serebrennikov namespace cwg17 { // cwg17: 2.7
254d358b2deSVlad Serebrennikov   class A {
255d358b2deSVlad Serebrennikov     int n;
256d358b2deSVlad Serebrennikov     int f();
257d358b2deSVlad Serebrennikov     struct C;
258d358b2deSVlad Serebrennikov   };
259d358b2deSVlad Serebrennikov   struct B : A {} b;
260d358b2deSVlad Serebrennikov   int A::f() { return b.n; }
261d358b2deSVlad Serebrennikov   struct A::C : A {
262d358b2deSVlad Serebrennikov     int g() { return n; }
263d358b2deSVlad Serebrennikov   };
264463e61a0SVlad Serebrennikov } // namespace cwg17
265d358b2deSVlad Serebrennikov 
266d358b2deSVlad Serebrennikov // cwg18: sup 577
267d358b2deSVlad Serebrennikov 
268d358b2deSVlad Serebrennikov namespace cwg19 { // cwg19: 3.1
269d358b2deSVlad Serebrennikov   struct A {
270d358b2deSVlad Serebrennikov     int n; // #cwg19-n
271d358b2deSVlad Serebrennikov   };
272d358b2deSVlad Serebrennikov   struct B : protected A { // #cwg19-B
273d358b2deSVlad Serebrennikov   };
274d358b2deSVlad Serebrennikov   struct C : B {} c;
275d358b2deSVlad Serebrennikov   struct D : B {
276d358b2deSVlad Serebrennikov     int get1() { return c.n; }
277d358b2deSVlad Serebrennikov     // expected-error@-1 {{'n' is a protected member of 'cwg19::A'}}
278d358b2deSVlad Serebrennikov     //   expected-note@#cwg19-B {{constrained by protected inheritance here}}
279d358b2deSVlad Serebrennikov     //   expected-note@#cwg19-n {{member is declared here}}
280d358b2deSVlad Serebrennikov     int get2() { return ((A&)c).n; } // ok, A is an accessible base of B from here
281d358b2deSVlad Serebrennikov   };
282463e61a0SVlad Serebrennikov } // namespace cwg19
283d358b2deSVlad Serebrennikov 
284d358b2deSVlad Serebrennikov namespace cwg20 { // cwg20: 2.8
285d358b2deSVlad Serebrennikov   class X {
286d358b2deSVlad Serebrennikov   public:
287d358b2deSVlad Serebrennikov     X();
288d358b2deSVlad Serebrennikov   private:
289d358b2deSVlad Serebrennikov     X(const X&); // #cwg20-X-ctor
290d358b2deSVlad Serebrennikov   };
291d358b2deSVlad Serebrennikov   X &f();
292d358b2deSVlad Serebrennikov   X x = f();
293d358b2deSVlad Serebrennikov   // expected-error@-1 {{calling a private constructor of class 'cwg20::X'}}
294d358b2deSVlad Serebrennikov   //   expected-note@#cwg20-X-ctor {{declared private here}}
295463e61a0SVlad Serebrennikov } // namespace cwg20
296d358b2deSVlad Serebrennikov 
297d358b2deSVlad Serebrennikov namespace cwg21 { // cwg21: 3.4
298d358b2deSVlad Serebrennikov   template<typename T> struct A;
299d358b2deSVlad Serebrennikov   struct X {
300d358b2deSVlad Serebrennikov     template<typename T = int> friend struct A;
301d358b2deSVlad Serebrennikov     // expected-error@-1 {{default template argument not permitted on a friend template}}
302d358b2deSVlad Serebrennikov     template<typename T = int> friend struct B;
303d358b2deSVlad Serebrennikov     // expected-error@-1 {{default template argument not permitted on a friend template}}
304d358b2deSVlad Serebrennikov   };
305463e61a0SVlad Serebrennikov } // namespace cwg21
306d358b2deSVlad Serebrennikov 
307d358b2deSVlad Serebrennikov namespace cwg22 { // cwg22: sup 481
308d358b2deSVlad Serebrennikov   template<typename cwg22_T = cwg22_T> struct X;
309d358b2deSVlad Serebrennikov   // expected-error@-1 {{unknown type name 'cwg22_T'}}
310d358b2deSVlad Serebrennikov   typedef int T;
311d358b2deSVlad Serebrennikov   template<typename T = T> struct Y;
312463e61a0SVlad Serebrennikov } // namespace cwg22
313d358b2deSVlad Serebrennikov 
31414ba3f9dSVlad Serebrennikov namespace cwg23 { // cwg23: 2.7
315d358b2deSVlad Serebrennikov   template<typename T> void f(T, T); // #cwg23-f-T-T
316d358b2deSVlad Serebrennikov   template<typename T> void f(T, int); // #cwg23-f-T-int
317d358b2deSVlad Serebrennikov   void g() { f(0, 0); }
318d358b2deSVlad Serebrennikov   // expected-error@-1 {{call to 'f' is ambiguous}}
319d358b2deSVlad Serebrennikov   //   expected-note@#cwg23-f-T-T {{candidate function [with T = int]}}
320d358b2deSVlad Serebrennikov   //   expected-note@#cwg23-f-T-int {{candidate function [with T = int]}}
321463e61a0SVlad Serebrennikov } // namespace cwg23
322d358b2deSVlad Serebrennikov 
323d358b2deSVlad Serebrennikov // cwg24: na
324d358b2deSVlad Serebrennikov 
32514ba3f9dSVlad Serebrennikov namespace cwg25 { // cwg25: 4
326d358b2deSVlad Serebrennikov   struct A {
327d358b2deSVlad Serebrennikov     void f() throw(int);
328d358b2deSVlad Serebrennikov     // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}}
329d358b2deSVlad Serebrennikov     //   since-cxx17-note@-2 {{use 'noexcept(false)' instead}}
330d358b2deSVlad Serebrennikov   };
331d358b2deSVlad Serebrennikov   void (A::*f)() throw (int);
332d358b2deSVlad Serebrennikov   // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}}
333d358b2deSVlad Serebrennikov   //   since-cxx17-note@-2 {{use 'noexcept(false)' instead}}
334d358b2deSVlad Serebrennikov   void (A::*g)() throw () = f;
335d358b2deSVlad Serebrennikov   // cxx98-14-error@-1 {{target exception specification is not superset of source}}
336d358b2deSVlad Serebrennikov   // since-cxx17-error@-2 {{different exception specifications}}
337d358b2deSVlad Serebrennikov   void (A::*g2)() throw () = 0;
338d358b2deSVlad Serebrennikov   void (A::*h)() throw (int, char) = f;
339d358b2deSVlad Serebrennikov   // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}}
340d358b2deSVlad Serebrennikov   //   since-cxx17-note@-2 {{use 'noexcept(false)' instead}}
341d358b2deSVlad Serebrennikov   void (A::*i)() throw () = &A::f;
342d358b2deSVlad Serebrennikov   // cxx98-14-error@-1 {{target exception specification is not superset of source}}
343d358b2deSVlad Serebrennikov   // since-cxx17-error@-2 {{different exception specifications}}
344d358b2deSVlad Serebrennikov   void (A::*i2)() throw () = 0;
345d358b2deSVlad Serebrennikov   void (A::*j)() throw (int, char) = &A::f;
346d358b2deSVlad Serebrennikov   // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}}
347d358b2deSVlad Serebrennikov   //   since-cxx17-note@-2 {{use 'noexcept(false)' instead}}
348d358b2deSVlad Serebrennikov   void x() {
349d358b2deSVlad Serebrennikov     g2 = f;
350d358b2deSVlad Serebrennikov     // cxx98-14-error@-1 {{target exception specification is not superset of source}}
351d358b2deSVlad Serebrennikov     // since-cxx17-error@-2 {{different exception specifications}}
352d358b2deSVlad Serebrennikov     h = f;
353d358b2deSVlad Serebrennikov     i2 = &A::f;
354d358b2deSVlad Serebrennikov     // cxx98-14-error@-1 {{target exception specification is not superset of source}}
355d358b2deSVlad Serebrennikov     // since-cxx17-error@-2 {{different exception specifications}}
356d358b2deSVlad Serebrennikov     j = &A::f;
357d358b2deSVlad Serebrennikov   }
358463e61a0SVlad Serebrennikov } // namespace cwg25
359d358b2deSVlad Serebrennikov 
36014ba3f9dSVlad Serebrennikov namespace cwg26 { // cwg26: 2.7
361d358b2deSVlad Serebrennikov   struct A { A(A, const A & = A()); };
362d358b2deSVlad Serebrennikov   // expected-error@-1 {{copy constructor must pass its first argument by reference}}
363d358b2deSVlad Serebrennikov   struct B {
364d358b2deSVlad Serebrennikov     B();
365d358b2deSVlad Serebrennikov     // FIXME: In C++98, we diagnose this twice.
366d358b2deSVlad Serebrennikov     B(const B &, B = B());
367d358b2deSVlad Serebrennikov     // cxx98-14-error@-1 {{recursive evaluation of default argument}}
368d358b2deSVlad Serebrennikov     //   cxx98-14-note@-2 {{default argument used here}}
369d358b2deSVlad Serebrennikov     // cxx98-error@-3 {{recursive evaluation of default argument}}
370d358b2deSVlad Serebrennikov     //   cxx98-note@-4 {{default argument used here}}
371d358b2deSVlad Serebrennikov   };
372d358b2deSVlad Serebrennikov   struct C {
373d358b2deSVlad Serebrennikov     static C &f();
374d358b2deSVlad Serebrennikov     C(const C &, C = f());
375d358b2deSVlad Serebrennikov     // expected-error@-1 {{recursive evaluation of default argument}}
376d358b2deSVlad Serebrennikov     //   expected-note@-2 {{default argument used here}}
377d358b2deSVlad Serebrennikov   };
378463e61a0SVlad Serebrennikov } // namespace cwg26
379d358b2deSVlad Serebrennikov 
38014ba3f9dSVlad Serebrennikov namespace cwg27 { // cwg27: 2.7
381d358b2deSVlad Serebrennikov   enum E { e } n;
382d358b2deSVlad Serebrennikov   E &m = true ? n : n;
383463e61a0SVlad Serebrennikov } // namespace cwg27
384d358b2deSVlad Serebrennikov 
385d358b2deSVlad Serebrennikov // cwg28: na lib
386d358b2deSVlad Serebrennikov 
387d358b2deSVlad Serebrennikov namespace cwg29 { // cwg29: 3.4
388d358b2deSVlad Serebrennikov   void cwg29_f0(); // #cwg29-f0
389d358b2deSVlad Serebrennikov   void g0() { void cwg29_f0(); }
390d358b2deSVlad Serebrennikov   extern "C++" void g0_cxx() { void cwg29_f0(); }
391d358b2deSVlad Serebrennikov   extern "C" void g0_c() { void cwg29_f0(); }
392d358b2deSVlad Serebrennikov   // expected-error@-1 {{declaration of 'cwg29_f0' has a different language linkage}}
393d358b2deSVlad Serebrennikov   //   expected-note@#cwg29-f0 {{previous declaration is here}}
394d358b2deSVlad Serebrennikov 
395d358b2deSVlad Serebrennikov   extern "C" void cwg29_f1(); // #cwg29-f1
396d358b2deSVlad Serebrennikov   void g1() { void cwg29_f1(); }
397d358b2deSVlad Serebrennikov   extern "C" void g1_c() { void cwg29_f1(); }
398d358b2deSVlad Serebrennikov   extern "C++" void g1_cxx() { void cwg29_f1(); }
399d358b2deSVlad Serebrennikov   // expected-error@-1 {{declaration of 'cwg29_f1' has a different language linkage}}
400d358b2deSVlad Serebrennikov   //   expected-note@#cwg29-f1 {{previous declaration is here}}
401d358b2deSVlad Serebrennikov 
402d358b2deSVlad Serebrennikov   void g2() { void cwg29_f2(); } // #cwg29-f2
403d358b2deSVlad Serebrennikov   extern "C" void cwg29_f2();
404d358b2deSVlad Serebrennikov   // expected-error@-1 {{declaration of 'cwg29_f2' has a different language linkage}}
405d358b2deSVlad Serebrennikov   //   expected-note@#cwg29-f2 {{previous declaration is here}}
406d358b2deSVlad Serebrennikov 
407d358b2deSVlad Serebrennikov   extern "C" void g3() { void cwg29_f3(); } // #cwg29-f3
408d358b2deSVlad Serebrennikov   extern "C++" void cwg29_f3();
409d358b2deSVlad Serebrennikov   // expected-error@-1 {{declaration of 'cwg29_f3' has a different language linkage}}
410d358b2deSVlad Serebrennikov   //   expected-note@#cwg29-f3 {{previous declaration is here}}
411d358b2deSVlad Serebrennikov 
412d358b2deSVlad Serebrennikov   extern "C++" void g4() { void cwg29_f4(); } // #cwg29-f4
413d358b2deSVlad Serebrennikov   extern "C" void cwg29_f4();
414d358b2deSVlad Serebrennikov   // expected-error@-1 {{declaration of 'cwg29_f4' has a different language linkage}}
415d358b2deSVlad Serebrennikov   //   expected-note@#cwg29-f4 {{previous declaration is here}}
416d358b2deSVlad Serebrennikov 
417d358b2deSVlad Serebrennikov   extern "C" void g5();
418d358b2deSVlad Serebrennikov   extern "C++" void cwg29_f5();
419d358b2deSVlad Serebrennikov   void g5() {
420d358b2deSVlad Serebrennikov     void cwg29_f5(); // ok, g5 is extern "C" but we're not inside the linkage-specification here.
421d358b2deSVlad Serebrennikov   }
422d358b2deSVlad Serebrennikov 
423d358b2deSVlad Serebrennikov   extern "C++" void g6();
424d358b2deSVlad Serebrennikov   extern "C" void cwg29_f6();
425d358b2deSVlad Serebrennikov   void g6() {
426d358b2deSVlad Serebrennikov     void cwg29_f6(); // ok, g6 is extern "C" but we're not inside the linkage-specification here.
427d358b2deSVlad Serebrennikov   }
428d358b2deSVlad Serebrennikov 
429d358b2deSVlad Serebrennikov   extern "C" void g7();
430d358b2deSVlad Serebrennikov   extern "C++" void cwg29_f7(); // #cwg29-f7
431d358b2deSVlad Serebrennikov   extern "C" void g7() {
432d358b2deSVlad Serebrennikov     void cwg29_f7();
433d358b2deSVlad Serebrennikov     // expected-error@-1 {{declaration of 'cwg29_f7' has a different language linkage}}
434d358b2deSVlad Serebrennikov     //   expected-note@#cwg29-f7 {{previous declaration is here}}
435d358b2deSVlad Serebrennikov   }
436d358b2deSVlad Serebrennikov 
437d358b2deSVlad Serebrennikov   extern "C++" void g8();
438d358b2deSVlad Serebrennikov   extern "C" void cwg29_f8(); // #cwg29-f8
439d358b2deSVlad Serebrennikov   extern "C++" void g8() {
440d358b2deSVlad Serebrennikov     void cwg29_f8();
441d358b2deSVlad Serebrennikov     // expected-error@-1 {{declaration of 'cwg29_f8' has a different language linkage}}
442d358b2deSVlad Serebrennikov     //   expected-note@#cwg29-f8 {{previous declaration is here}}
443d358b2deSVlad Serebrennikov   }
444463e61a0SVlad Serebrennikov } // namespace cwg29
445d358b2deSVlad Serebrennikov 
446d358b2deSVlad Serebrennikov namespace cwg30 { // cwg30: sup 468 c++11
447d358b2deSVlad Serebrennikov   struct A {
448d358b2deSVlad Serebrennikov     template<int> static int f();
449d358b2deSVlad Serebrennikov   } a, *p = &a;
450d358b2deSVlad Serebrennikov   // FIXME: It's not clear whether CWG468 applies to C++98 too.
451d358b2deSVlad Serebrennikov   int x = A::template f<0>();
452d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{'template' keyword outside of a template}}
453d358b2deSVlad Serebrennikov   int y = a.template f<0>();
454d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{'template' keyword outside of a template}}
455d358b2deSVlad Serebrennikov   int z = p->template f<0>();
456d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{'template' keyword outside of a template}}
457463e61a0SVlad Serebrennikov } // namespace cwg30
458d358b2deSVlad Serebrennikov 
459d358b2deSVlad Serebrennikov namespace cwg31 { // cwg31: 2.8
460d358b2deSVlad Serebrennikov   class X {
461d358b2deSVlad Serebrennikov   private:
462d358b2deSVlad Serebrennikov     void operator delete(void*); // #cwg31-delete
463d358b2deSVlad Serebrennikov   };
464d358b2deSVlad Serebrennikov   // We would call X::operator delete if X() threw (even though it can't,
465d358b2deSVlad Serebrennikov   // and even though we allocated the X using ::operator delete).
466d358b2deSVlad Serebrennikov   X *p = new X;
467d358b2deSVlad Serebrennikov   // expected-error@-1 {{'operator delete' is a private member of 'cwg31::X'}}
468d358b2deSVlad Serebrennikov   //   expected-note@#cwg31-delete {{declared private here}}
469463e61a0SVlad Serebrennikov } // namespace cwg31
470d358b2deSVlad Serebrennikov 
471d358b2deSVlad Serebrennikov // cwg32: na
472d358b2deSVlad Serebrennikov 
473d358b2deSVlad Serebrennikov namespace cwg33 { // cwg33: 9
474d358b2deSVlad Serebrennikov   namespace X { struct S; void f(void (*)(S)); } // #cwg33-f-S
475d358b2deSVlad Serebrennikov   namespace Y { struct T; void f(void (*)(T)); } // #cwg33-f-T
476d358b2deSVlad Serebrennikov   void g(X::S);
477d358b2deSVlad Serebrennikov   template<typename Z> Z g(Y::T);
478d358b2deSVlad Serebrennikov   void h() { f(&g); }
479d358b2deSVlad Serebrennikov   // expected-error@-1 {{call to 'f' is ambiguous}}
480d358b2deSVlad Serebrennikov   //   expected-note@#cwg33-f-S {{candidate function}}
481d358b2deSVlad Serebrennikov   //   expected-note@#cwg33-f-T {{candidate function}}
482d358b2deSVlad Serebrennikov 
483d358b2deSVlad Serebrennikov   template<typename T> void t(X::S);
484d358b2deSVlad Serebrennikov   template<typename T, typename U = void> void u(X::S);
485d358b2deSVlad Serebrennikov   // expected-error@-1 0-1 {{default template arguments for a function template are a C++11 extension}}
486d358b2deSVlad Serebrennikov   void templ() { f(t<int>); f(u<int>); }
487d358b2deSVlad Serebrennikov 
488d358b2deSVlad Serebrennikov   // Even though v<int> cannot select the first overload, ADL considers it
489d358b2deSVlad Serebrennikov   // and adds namespace Z to the set of associated namespaces, and then picks
490d358b2deSVlad Serebrennikov   // Z::f even though that function has nothing to do with any associated type.
491d358b2deSVlad Serebrennikov   namespace Z { struct Q; void f(void(*)()); }
492d358b2deSVlad Serebrennikov   template<int> Z::Q v();
493d358b2deSVlad Serebrennikov   template<typename> void v();
494d358b2deSVlad Serebrennikov   void unrelated_templ() { f(v<int>); }
495d358b2deSVlad Serebrennikov 
496d358b2deSVlad Serebrennikov   namespace dependent {
497d358b2deSVlad Serebrennikov     struct X {};
498d358b2deSVlad Serebrennikov     template<class T> struct Y {
499d358b2deSVlad Serebrennikov       friend int operator+(X, void(*)(Y)) {}
500d358b2deSVlad Serebrennikov     };
501d358b2deSVlad Serebrennikov 
502d358b2deSVlad Serebrennikov     template<typename T> void f(Y<T>);
503d358b2deSVlad Serebrennikov     int use = X() + f<int>;
504d358b2deSVlad Serebrennikov     // expected-error@-1 {{invalid operands to binary expression ('X' and 'void (Y<int>)')}}
505d358b2deSVlad Serebrennikov   }
506d358b2deSVlad Serebrennikov 
507d358b2deSVlad Serebrennikov   namespace member {
508d358b2deSVlad Serebrennikov     struct Q {};
509d358b2deSVlad Serebrennikov     struct Y { friend int operator+(Q, Y (*)()); };
510d358b2deSVlad Serebrennikov     struct X { template<typename> static Y f(); };
511d358b2deSVlad Serebrennikov     int m = Q() + X().f<int>; // ok
512d358b2deSVlad Serebrennikov     int n = Q() + (&(X().f<int>)); // ok
513d358b2deSVlad Serebrennikov   }
514463e61a0SVlad Serebrennikov } // namespace cwg33
515d358b2deSVlad Serebrennikov 
516d358b2deSVlad Serebrennikov // cwg34: na
517d358b2deSVlad Serebrennikov // cwg35: dup 178
518d358b2deSVlad Serebrennikov 
519d358b2deSVlad Serebrennikov namespace cwg36 { // cwg36: 2.8
520d358b2deSVlad Serebrennikov namespace example1 {
521d358b2deSVlad Serebrennikov   namespace A {
522d358b2deSVlad Serebrennikov     int i;
523d358b2deSVlad Serebrennikov   }
524d358b2deSVlad Serebrennikov 
525d358b2deSVlad Serebrennikov   namespace A1 {
526d358b2deSVlad Serebrennikov     using A::i;
527d358b2deSVlad Serebrennikov     using A::i;
528d358b2deSVlad Serebrennikov   }
529d358b2deSVlad Serebrennikov 
530d358b2deSVlad Serebrennikov   void f()
531d358b2deSVlad Serebrennikov   {
532d358b2deSVlad Serebrennikov     using A::i;
533d358b2deSVlad Serebrennikov     using A::i;
534d358b2deSVlad Serebrennikov   }
535d358b2deSVlad Serebrennikov }
536d358b2deSVlad Serebrennikov 
537d358b2deSVlad Serebrennikov namespace example2 {
538d358b2deSVlad Serebrennikov   struct A
539d358b2deSVlad Serebrennikov   {
540d358b2deSVlad Serebrennikov     int i;
541d358b2deSVlad Serebrennikov     static int j;
542d358b2deSVlad Serebrennikov   };
543d358b2deSVlad Serebrennikov 
544d358b2deSVlad Serebrennikov   struct B : A { };
545d358b2deSVlad Serebrennikov   struct C : A { };
546d358b2deSVlad Serebrennikov 
547d358b2deSVlad Serebrennikov   struct D : virtual B, virtual C
548d358b2deSVlad Serebrennikov   {
549d358b2deSVlad Serebrennikov     using B::i; // #cwg36-ex2-B-i-first
550d358b2deSVlad Serebrennikov     using B::i;
551d358b2deSVlad Serebrennikov     // expected-error@-1 {{redeclaration of using declaration}}
552d358b2deSVlad Serebrennikov     //   expected-note@#cwg36-ex2-B-i-first {{previous using declaration}}
553d358b2deSVlad Serebrennikov 
554d358b2deSVlad Serebrennikov     using C::i; // #cwg36-ex2-C-i-first
555d358b2deSVlad Serebrennikov     using C::i;
556d358b2deSVlad Serebrennikov     // expected-error@-1 {{redeclaration of using declaration}}
557d358b2deSVlad Serebrennikov     //   expected-note@#cwg36-ex2-C-i-first {{previous using declaration}}
558d358b2deSVlad Serebrennikov 
559d358b2deSVlad Serebrennikov     using B::j; // #cwg36-ex2-B-j-first
560d358b2deSVlad Serebrennikov     using B::j;
561d358b2deSVlad Serebrennikov     // expected-error@-1 {{redeclaration of using declaration}}
562d358b2deSVlad Serebrennikov     //   expected-note@#cwg36-ex2-B-j-first {{previous using declaration}}
563d358b2deSVlad Serebrennikov 
564d358b2deSVlad Serebrennikov     using C::j; // #cwg36-ex2-C-j-first
565d358b2deSVlad Serebrennikov     using C::j;
566d358b2deSVlad Serebrennikov     // expected-error@-1 {{redeclaration of using declaration}}
567d358b2deSVlad Serebrennikov     //   expected-note@#cwg36-ex2-C-j-first {{previous using declaration}}
568d358b2deSVlad Serebrennikov   };
569d358b2deSVlad Serebrennikov }
570d358b2deSVlad Serebrennikov 
571d358b2deSVlad Serebrennikov namespace example3 {
572d358b2deSVlad Serebrennikov   template<typename T>
573d358b2deSVlad Serebrennikov   struct A
574d358b2deSVlad Serebrennikov   {
575d358b2deSVlad Serebrennikov     T i;
576d358b2deSVlad Serebrennikov     static T j;
577d358b2deSVlad Serebrennikov   };
578d358b2deSVlad Serebrennikov 
579d358b2deSVlad Serebrennikov   template<typename T>
580d358b2deSVlad Serebrennikov   struct B : A<T> { };
581d358b2deSVlad Serebrennikov   template<typename T>
582d358b2deSVlad Serebrennikov   struct C : A<T> { };
583d358b2deSVlad Serebrennikov 
584d358b2deSVlad Serebrennikov   template<typename T>
585d358b2deSVlad Serebrennikov   struct D : virtual B<T>, virtual C<T>
586d358b2deSVlad Serebrennikov   {
587d358b2deSVlad Serebrennikov     using B<T>::i; // #cwg36-ex3-B-i-first
588d358b2deSVlad Serebrennikov     using B<T>::i;
589d358b2deSVlad Serebrennikov     // expected-error@-1 {{redeclaration of using declaration}}
590d358b2deSVlad Serebrennikov     //   expected-note@#cwg36-ex3-B-i-first {{previous using declaration}}
591d358b2deSVlad Serebrennikov 
592d358b2deSVlad Serebrennikov     using C<T>::i; // #cwg36-ex3-C-i-first
593d358b2deSVlad Serebrennikov     using C<T>::i;
594d358b2deSVlad Serebrennikov     // expected-error@-1 {{redeclaration of using declaration}}
595d358b2deSVlad Serebrennikov     //   expected-note@#cwg36-ex3-C-i-first {{previous using declaration}}
596d358b2deSVlad Serebrennikov 
597d358b2deSVlad Serebrennikov     using B<T>::j; // #cwg36-ex3-B-j-first
598d358b2deSVlad Serebrennikov     using B<T>::j;
599d358b2deSVlad Serebrennikov     // expected-error@-1 {{redeclaration of using declaration}}
600d358b2deSVlad Serebrennikov     //   expected-note@#cwg36-ex3-B-j-first {{previous using declaration}}
601d358b2deSVlad Serebrennikov 
602d358b2deSVlad Serebrennikov     using C<T>::j; // #cwg36-ex3-C-j-first
603d358b2deSVlad Serebrennikov     using C<T>::j;
604d358b2deSVlad Serebrennikov     // expected-error@-1 {{redeclaration of using declaration}}
605d358b2deSVlad Serebrennikov     //   expected-note@#cwg36-ex3-C-j-first {{previous using declaration}}
606d358b2deSVlad Serebrennikov   };
607d358b2deSVlad Serebrennikov }
608d358b2deSVlad Serebrennikov namespace example4 {
609d358b2deSVlad Serebrennikov   template<typename T>
610d358b2deSVlad Serebrennikov   struct E {
611d358b2deSVlad Serebrennikov     T k;
612d358b2deSVlad Serebrennikov   };
613d358b2deSVlad Serebrennikov 
614d358b2deSVlad Serebrennikov   template<typename T>
615d358b2deSVlad Serebrennikov   struct G : E<T> {
616d358b2deSVlad Serebrennikov     using E<T>::k; // #cwg36-E-k-first
617d358b2deSVlad Serebrennikov     using E<T>::k;
618d358b2deSVlad Serebrennikov     // expected-error@-1 {{redeclaration of using declaration}}
619d358b2deSVlad Serebrennikov     //   expected-note@#cwg36-E-k-first {{previous using declaration}}
620d358b2deSVlad Serebrennikov   };
621d358b2deSVlad Serebrennikov }
622463e61a0SVlad Serebrennikov } // namespace cwg36
623d358b2deSVlad Serebrennikov 
624d358b2deSVlad Serebrennikov // cwg37: sup 475
625d358b2deSVlad Serebrennikov 
62614ba3f9dSVlad Serebrennikov namespace cwg38 { // cwg38: 2.7
627d358b2deSVlad Serebrennikov   template<typename T> struct X {};
628d358b2deSVlad Serebrennikov   template<typename T> X<T> operator+(X<T> a, X<T> b) { return a; }
629d358b2deSVlad Serebrennikov   template X<int> operator+<int>(X<int>, X<int>);
630463e61a0SVlad Serebrennikov } // namespace cwg38
631d358b2deSVlad Serebrennikov 
632d358b2deSVlad Serebrennikov namespace cwg39 { // cwg39: no
633d358b2deSVlad Serebrennikov   namespace example1 {
634d358b2deSVlad Serebrennikov     struct A { int &f(int); };
635d358b2deSVlad Serebrennikov     struct B : A {
636d358b2deSVlad Serebrennikov       using A::f;
637d358b2deSVlad Serebrennikov       float &f(float);
638d358b2deSVlad Serebrennikov     } b;
639d358b2deSVlad Serebrennikov     int &r = b.f(0);
640d358b2deSVlad Serebrennikov   }
641d358b2deSVlad Serebrennikov 
642d358b2deSVlad Serebrennikov   namespace example2 {
643d358b2deSVlad Serebrennikov     struct A {
644d358b2deSVlad Serebrennikov       int &x(int); // #cwg39-A-x-decl
645d358b2deSVlad Serebrennikov       static int &y(int); // #cwg39-A-y-decl
646d358b2deSVlad Serebrennikov     };
647d358b2deSVlad Serebrennikov     struct V {
648d358b2deSVlad Serebrennikov       int &z(int);
649d358b2deSVlad Serebrennikov     };
650d358b2deSVlad Serebrennikov     struct B : A, virtual V {
651d358b2deSVlad Serebrennikov       using A::x; // #cwg39-using-A-x
652d358b2deSVlad Serebrennikov       float &x(float);
653d358b2deSVlad Serebrennikov       using A::y; // #cwg39-using-A-y
654d358b2deSVlad Serebrennikov       static float &y(float);
655d358b2deSVlad Serebrennikov       using V::z;
656d358b2deSVlad Serebrennikov       float &z(float);
657d358b2deSVlad Serebrennikov     };
658d358b2deSVlad Serebrennikov     struct C : A, B, virtual V {} c;
659d358b2deSVlad Serebrennikov     /* expected-warning@-1
660d358b2deSVlad Serebrennikov     {{direct base 'A' is inaccessible due to ambiguity:
661d358b2deSVlad Serebrennikov     struct cwg39::example2::C -> A
662d358b2deSVlad Serebrennikov     struct cwg39::example2::C -> B -> A}} */
663d358b2deSVlad Serebrennikov     int &x = c.x(0);
664d358b2deSVlad Serebrennikov     // expected-error@-1 {{member 'x' found in multiple base classes of different types}}
665d358b2deSVlad Serebrennikov     //   expected-note@#cwg39-A-x-decl {{member found by ambiguous name lookup}}
666d358b2deSVlad Serebrennikov     //   expected-note@#cwg39-using-A-x {{member found by ambiguous name lookup}}
667d358b2deSVlad Serebrennikov 
668d358b2deSVlad Serebrennikov     // FIXME: This is valid, because we find the same static data member either way.
669d358b2deSVlad Serebrennikov     int &y = c.y(0);
670d358b2deSVlad Serebrennikov     // expected-error@-1 {{member 'y' found in multiple base classes of different types}}
671d358b2deSVlad Serebrennikov     //   expected-note@#cwg39-A-y-decl {{member found by ambiguous name lookup}}
672d358b2deSVlad Serebrennikov     //   expected-note@#cwg39-using-A-y {{member found by ambiguous name lookup}}
673d358b2deSVlad Serebrennikov     int &z = c.z(0);
674d358b2deSVlad Serebrennikov   }
675d358b2deSVlad Serebrennikov 
676d358b2deSVlad Serebrennikov   namespace example3 {
677d358b2deSVlad Serebrennikov     struct A { static int f(); };
678d358b2deSVlad Serebrennikov     struct B : virtual A { using A::f; };
679d358b2deSVlad Serebrennikov     struct C : virtual A { using A::f; };
680d358b2deSVlad Serebrennikov     struct D : B, C {} d;
681d358b2deSVlad Serebrennikov     int k = d.f();
682d358b2deSVlad Serebrennikov   }
683d358b2deSVlad Serebrennikov 
684d358b2deSVlad Serebrennikov   namespace example4 {
685d358b2deSVlad Serebrennikov     struct A { int n; }; // #cwg39-ex4-A-n
686d358b2deSVlad Serebrennikov     struct B : A {};
687d358b2deSVlad Serebrennikov     struct C : A {};
688d358b2deSVlad Serebrennikov     struct D : B, C { int f() { return n; } };
689d358b2deSVlad Serebrennikov     /* expected-error@-1
690d358b2deSVlad Serebrennikov     {{non-static member 'n' found in multiple base-class subobjects of type 'A':
691d358b2deSVlad Serebrennikov     struct cwg39::example4::D -> B -> A
692d358b2deSVlad Serebrennikov     struct cwg39::example4::D -> C -> A}} */
693d358b2deSVlad Serebrennikov     //   expected-note@#cwg39-ex4-A-n {{member found by ambiguous name lookup}}
694d358b2deSVlad Serebrennikov   }
695d358b2deSVlad Serebrennikov 
696d358b2deSVlad Serebrennikov   namespace PR5916 {
697d358b2deSVlad Serebrennikov     // FIXME: This is valid.
698d358b2deSVlad Serebrennikov     struct A { int n; }; // #cwg39-A-n
699d358b2deSVlad Serebrennikov     struct B : A {};
700d358b2deSVlad Serebrennikov     struct C : A {};
701d358b2deSVlad Serebrennikov     struct D : B, C {};
702d358b2deSVlad Serebrennikov     int k = sizeof(D::n); // #cwg39-sizeof
703d358b2deSVlad Serebrennikov     /* expected-error@#cwg39-sizeof
704d358b2deSVlad Serebrennikov     {{non-static member 'n' found in multiple base-class subobjects of type 'A':
705d358b2deSVlad Serebrennikov     struct cwg39::PR5916::D -> B -> A
706d358b2deSVlad Serebrennikov     struct cwg39::PR5916::D -> C -> A}} */
707d358b2deSVlad Serebrennikov     //   expected-note@#cwg39-A-n {{member found by ambiguous name lookup}}
708d358b2deSVlad Serebrennikov 
709d358b2deSVlad Serebrennikov     // expected-error@#cwg39-sizeof {{unknown type name}}
710d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
711d358b2deSVlad Serebrennikov     decltype(D::n) n;
712eff12650SVlad Serebrennikov     /* since-cxx11-error@-1
713d358b2deSVlad Serebrennikov     {{non-static member 'n' found in multiple base-class subobjects of type 'A':
714d358b2deSVlad Serebrennikov     struct cwg39::PR5916::D -> B -> A
715d358b2deSVlad Serebrennikov     struct cwg39::PR5916::D -> C -> A}} */
716eff12650SVlad Serebrennikov     //   since-cxx11-note@#cwg39-A-n {{member found by ambiguous name lookup}}
717d358b2deSVlad Serebrennikov #endif
718d358b2deSVlad Serebrennikov   }
719463e61a0SVlad Serebrennikov } // namespace cwg39
720d358b2deSVlad Serebrennikov 
721d358b2deSVlad Serebrennikov // cwg40: na
722d358b2deSVlad Serebrennikov 
72314ba3f9dSVlad Serebrennikov namespace cwg41 { // cwg41: 2.7
724d358b2deSVlad Serebrennikov   struct S f(S);
725463e61a0SVlad Serebrennikov } // namespace cwg41
726d358b2deSVlad Serebrennikov 
72714ba3f9dSVlad Serebrennikov namespace cwg42 { // cwg42: 2.7
728d358b2deSVlad Serebrennikov   struct A { static const int k = 0; };
729d358b2deSVlad Serebrennikov   struct B : A { static const int k = A::k; };
730463e61a0SVlad Serebrennikov } // namespace cwg42
731d358b2deSVlad Serebrennikov 
732d358b2deSVlad Serebrennikov // cwg43: na
733d358b2deSVlad Serebrennikov 
734d358b2deSVlad Serebrennikov namespace cwg44 { // cwg44: sup 727
735d358b2deSVlad Serebrennikov   struct A {
736d358b2deSVlad Serebrennikov     template<int> void f();
737d358b2deSVlad Serebrennikov     template<> void f<0>();
738d358b2deSVlad Serebrennikov   };
739463e61a0SVlad Serebrennikov } // namespace cwg44
740d358b2deSVlad Serebrennikov 
74114ba3f9dSVlad Serebrennikov namespace cwg45 { // cwg45: 2.7
742d358b2deSVlad Serebrennikov   class A {
743d358b2deSVlad Serebrennikov     class B {};
744d358b2deSVlad Serebrennikov     class C : B {};
745d358b2deSVlad Serebrennikov     C c;
746d358b2deSVlad Serebrennikov   };
747463e61a0SVlad Serebrennikov } // namespace cwg45
748d358b2deSVlad Serebrennikov 
74914ba3f9dSVlad Serebrennikov namespace cwg46 { // cwg46: 2.7
750d358b2deSVlad Serebrennikov   template<typename> struct A { template<typename> struct B {}; };
751d358b2deSVlad Serebrennikov   template template struct A<int>::B<int>;
752d358b2deSVlad Serebrennikov   // expected-error@-1 {{expected unqualified-id}}
753463e61a0SVlad Serebrennikov } // namespace cwg46
754d358b2deSVlad Serebrennikov 
755d358b2deSVlad Serebrennikov namespace cwg47 { // cwg47: sup 329
756d358b2deSVlad Serebrennikov   template<typename T> struct A {
757d358b2deSVlad Serebrennikov     friend void f() { T t; } // #cwg47-f
758d358b2deSVlad Serebrennikov     // expected-error@-1 {{redefinition of 'f'}}
759d358b2deSVlad Serebrennikov     //   expected-note@#cwg47-b {{in instantiation of template class 'cwg47::A<float>' requested here}}
760d358b2deSVlad Serebrennikov     //   expected-note@#cwg47-f {{previous definition is here}}
761d358b2deSVlad Serebrennikov   };
762d358b2deSVlad Serebrennikov   A<int> a;
763d358b2deSVlad Serebrennikov   A<float> b; // #cwg47-b
764d358b2deSVlad Serebrennikov 
765d358b2deSVlad Serebrennikov   void f();
766d358b2deSVlad Serebrennikov   void g() { f(); }
767463e61a0SVlad Serebrennikov } // namespace cwg47
768d358b2deSVlad Serebrennikov 
76914ba3f9dSVlad Serebrennikov namespace cwg48 { // cwg48: 2.7
770d358b2deSVlad Serebrennikov   namespace {
771d358b2deSVlad Serebrennikov     struct S {
772d358b2deSVlad Serebrennikov       static const int m = 0;
773d358b2deSVlad Serebrennikov       static const int n = 0;
774d358b2deSVlad Serebrennikov       static const int o = 0;
775d358b2deSVlad Serebrennikov     };
776d358b2deSVlad Serebrennikov   }
777d358b2deSVlad Serebrennikov   int a = S::m;
778d358b2deSVlad Serebrennikov   // FIXME: We should produce a 'has internal linkage but is not defined'
779d358b2deSVlad Serebrennikov   // diagnostic for 'S::n'.
780d358b2deSVlad Serebrennikov   const int &b = S::n;
781d358b2deSVlad Serebrennikov   const int S::o;
782d358b2deSVlad Serebrennikov   const int &c = S::o;
783463e61a0SVlad Serebrennikov } // namespace cwg48
784d358b2deSVlad Serebrennikov 
785d358b2deSVlad Serebrennikov namespace cwg49 { // cwg49: 2.8
786d358b2deSVlad Serebrennikov   template<int*> struct A {}; // #cwg49-A
787d358b2deSVlad Serebrennikov   int k;
788d358b2deSVlad Serebrennikov #if __has_feature(cxx_constexpr)
789d358b2deSVlad Serebrennikov   constexpr
790d358b2deSVlad Serebrennikov #endif
791d358b2deSVlad Serebrennikov   int *const p = &k; // #cwg49-p
792d358b2deSVlad Serebrennikov   A<&k> a;
793d358b2deSVlad Serebrennikov   A<p> b; // #cwg49-b
794d358b2deSVlad Serebrennikov   // cxx98-error@#cwg49-b {{non-type template argument referring to object 'p' with internal linkage is a C++11 extension}}
795d358b2deSVlad Serebrennikov   //   cxx98-note@#cwg49-p {{non-type template argument refers to object here}}
796d358b2deSVlad Serebrennikov   // cxx98-14-error@#cwg49-b {{non-type template argument for template parameter of pointer type 'int *' must have its address taken}}
797d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg49-A {{template parameter is declared here}}
798d358b2deSVlad Serebrennikov   int *q = &k; // #cwg49-q
799d358b2deSVlad Serebrennikov   A<q> c; // #cwg49-c
800d358b2deSVlad Serebrennikov   // cxx98-error@#cwg49-c {{non-type template argument for template parameter of pointer type 'int *' must have its address taken}}
801d358b2deSVlad Serebrennikov   //   cxx98-note@#cwg49-A {{template parameter is declared here}}
802d358b2deSVlad Serebrennikov   // cxx11-14-error@#cwg49-c {{non-type template argument of type 'int *' is not a constant expression}}
803d358b2deSVlad Serebrennikov   //   cxx11-14-note@#cwg49-c {{read of non-constexpr variable 'q' is not allowed in a constant expression}}
804d358b2deSVlad Serebrennikov   //   cxx11-14-note@#cwg49-q {{declared here}}
805d358b2deSVlad Serebrennikov   //   cxx11-14-note@#cwg49-A {{template parameter is declared here}}
806d358b2deSVlad Serebrennikov   // since-cxx17-error@#cwg49-c {{non-type template argument is not a constant expression}}
807d358b2deSVlad Serebrennikov   //   since-cxx17-note@#cwg49-c {{read of non-constexpr variable 'q' is not allowed in a constant expression}}
808d358b2deSVlad Serebrennikov   //   since-cxx17-note@#cwg49-q {{declared here}}
809463e61a0SVlad Serebrennikov } // namespace cwg49
810d358b2deSVlad Serebrennikov 
81114ba3f9dSVlad Serebrennikov namespace cwg50 { // cwg50: 2.7
812d358b2deSVlad Serebrennikov   struct X; // #cwg50-X
813d358b2deSVlad Serebrennikov   extern X *p;
814d358b2deSVlad Serebrennikov   X *q = (X*)p;
815d358b2deSVlad Serebrennikov   X *r = static_cast<X*>(p);
816d358b2deSVlad Serebrennikov   X *s = const_cast<X*>(p);
817d358b2deSVlad Serebrennikov   X *t = reinterpret_cast<X*>(p);
818d358b2deSVlad Serebrennikov   X *u = dynamic_cast<X*>(p);
819d358b2deSVlad Serebrennikov   // expected-error@-1 {{'cwg50::X' is an incomplete type}}
820d358b2deSVlad Serebrennikov   //   expected-note@#cwg50-X {{forward declaration of 'cwg50::X'}}
821463e61a0SVlad Serebrennikov } // namespace cwg50
822d358b2deSVlad Serebrennikov 
823d358b2deSVlad Serebrennikov namespace cwg51 { // cwg51: 2.8
824d358b2deSVlad Serebrennikov   struct A {};
825d358b2deSVlad Serebrennikov   struct B : A {};
826d358b2deSVlad Serebrennikov   struct S {
827d358b2deSVlad Serebrennikov     operator A&();
828d358b2deSVlad Serebrennikov     operator B&();
829d358b2deSVlad Serebrennikov   } s;
830d358b2deSVlad Serebrennikov   A &a = s;
831463e61a0SVlad Serebrennikov } // namespace cwg51
832d358b2deSVlad Serebrennikov 
833d358b2deSVlad Serebrennikov namespace cwg52 { // cwg52: 2.8
834d358b2deSVlad Serebrennikov   struct A { int n; }; // #cwg52-A
835d358b2deSVlad Serebrennikov   struct B : private A {} b; // #cwg52-B
836d358b2deSVlad Serebrennikov   int k = b.A::n; // #cwg52-k
837d358b2deSVlad Serebrennikov   // FIXME: This first diagnostic is very strangely worded, and seems to be bogus.
838d358b2deSVlad Serebrennikov   // expected-error@#cwg52-k {{'A' is a private member of 'cwg52::A'}}
839d358b2deSVlad Serebrennikov   //   expected-note@#cwg52-B {{constrained by private inheritance here}}
840d358b2deSVlad Serebrennikov   //   expected-note@#cwg52-A {{member is declared here}}
841d358b2deSVlad Serebrennikov   // expected-error@#cwg52-k {{cannot cast 'struct B' to its private base class 'cwg52::A'}}
842d358b2deSVlad Serebrennikov   //   expected-note@#cwg52-B {{declared private here}}
843463e61a0SVlad Serebrennikov } // namespace cwg52
844d358b2deSVlad Serebrennikov 
84514ba3f9dSVlad Serebrennikov namespace cwg53 { // cwg53: 2.7
846d358b2deSVlad Serebrennikov   int n = 0;
847d358b2deSVlad Serebrennikov   enum E { e } x = static_cast<E>(n);
848463e61a0SVlad Serebrennikov } // namespace cwg53
849d358b2deSVlad Serebrennikov 
850d358b2deSVlad Serebrennikov namespace cwg54 { // cwg54: 2.8
851d358b2deSVlad Serebrennikov   struct A { int a; } a;
852d358b2deSVlad Serebrennikov   struct V { int v; } v;
853d358b2deSVlad Serebrennikov   struct B : private A, virtual V { int b; } b; // #cwg54-B
854d358b2deSVlad Serebrennikov 
855d358b2deSVlad Serebrennikov   A &sab = static_cast<A&>(b);
856d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot cast 'struct B' to its private base class 'A'}}
857d358b2deSVlad Serebrennikov   //   expected-note@#cwg54-B {{declared private here}}
858d358b2deSVlad Serebrennikov   A *spab = static_cast<A*>(&b);
859d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot cast 'struct B' to its private base class 'A'}}
860d358b2deSVlad Serebrennikov   //   expected-note@#cwg54-B {{declared private here}}
861d358b2deSVlad Serebrennikov   int A::*smab = static_cast<int A::*>(&B::b);
86270c1764dSNathan Ridge   // expected-error@-1 {{cannot cast 'cwg54::B' to its private base class 'A'}}
863d358b2deSVlad Serebrennikov   //   expected-note@#cwg54-B {{declared private here}}
864d358b2deSVlad Serebrennikov   B &sba = static_cast<B&>(a);
865d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot cast private base class 'cwg54::A' to 'cwg54::B'}}
866d358b2deSVlad Serebrennikov   //   expected-note@#cwg54-B {{declared private here}}
867d358b2deSVlad Serebrennikov   B *spba = static_cast<B*>(&a);
868d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot cast private base class 'cwg54::A' to 'cwg54::B'}}
869d358b2deSVlad Serebrennikov   //   expected-note@#cwg54-B {{declared private here}}
870d358b2deSVlad Serebrennikov   int B::*smba = static_cast<int B::*>(&A::a);
87170c1764dSNathan Ridge   // expected-error@-1 {{cannot cast private base class 'cwg54::A' to 'B'}}
872d358b2deSVlad Serebrennikov   //   expected-note@#cwg54-B {{declared private here}}
873d358b2deSVlad Serebrennikov 
874d358b2deSVlad Serebrennikov   V &svb = static_cast<V&>(b);
875d358b2deSVlad Serebrennikov   V *spvb = static_cast<V*>(&b);
876d358b2deSVlad Serebrennikov   int V::*smvb = static_cast<int V::*>(&B::b);
87770c1764dSNathan Ridge   // expected-error@-1 {{conversion from pointer to member of class 'cwg54::B' to pointer to member of class 'V' via virtual base 'cwg54::V' is not allowed}}
878d358b2deSVlad Serebrennikov   B &sbv = static_cast<B&>(v);
879d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot cast 'struct V' to 'B &' via virtual base 'cwg54::V'}}
880d358b2deSVlad Serebrennikov   B *spbv = static_cast<B*>(&v);
881d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot cast 'cwg54::V *' to 'B *' via virtual base 'cwg54::V'}}
882d358b2deSVlad Serebrennikov   int B::*smbv = static_cast<int B::*>(&V::v);
88370c1764dSNathan Ridge   // expected-error@-1 {{conversion from pointer to member of class 'cwg54::V' to pointer to member of class 'B' via virtual base 'cwg54::V' is not allowed}}
884d358b2deSVlad Serebrennikov 
885d358b2deSVlad Serebrennikov   A &cab = (A&)(b);
886d358b2deSVlad Serebrennikov   A *cpab = (A*)(&b);
887d358b2deSVlad Serebrennikov   int A::*cmab = (int A::*)(&B::b);
888d358b2deSVlad Serebrennikov   B &cba = (B&)(a);
889d358b2deSVlad Serebrennikov   B *cpba = (B*)(&a);
890d358b2deSVlad Serebrennikov   int B::*cmba = (int B::*)(&A::a);
891d358b2deSVlad Serebrennikov 
892d358b2deSVlad Serebrennikov   V &cvb = (V&)(b);
893d358b2deSVlad Serebrennikov   V *cpvb = (V*)(&b);
894d358b2deSVlad Serebrennikov   int V::*cmvb = (int V::*)(&B::b);
89570c1764dSNathan Ridge   // expected-error@-1 {{conversion from pointer to member of class 'cwg54::B' to pointer to member of class 'V' via virtual base 'cwg54::V' is not allowed}}
896d358b2deSVlad Serebrennikov   B &cbv = (B&)(v);
897d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot cast 'struct V' to 'B &' via virtual base 'cwg54::V'}}
898d358b2deSVlad Serebrennikov   B *cpbv = (B*)(&v);
899d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot cast 'cwg54::V *' to 'B *' via virtual base 'cwg54::V'}}
900d358b2deSVlad Serebrennikov   int B::*cmbv = (int B::*)(&V::v);
90170c1764dSNathan Ridge   // expected-error@-1 {{conversion from pointer to member of class 'cwg54::V' to pointer to member of class 'B' via virtual base 'cwg54::V' is not allowed}}
902463e61a0SVlad Serebrennikov } // namespace cwg54
903d358b2deSVlad Serebrennikov 
90414ba3f9dSVlad Serebrennikov namespace cwg55 { // cwg55: 2.7
905d358b2deSVlad Serebrennikov   enum E { e = 5 };
906d358b2deSVlad Serebrennikov   static_assert(e + 1 == 6, "");
907463e61a0SVlad Serebrennikov } // namespace cwg55
908d358b2deSVlad Serebrennikov 
90914ba3f9dSVlad Serebrennikov namespace cwg56 { // cwg56: 2.7
910d358b2deSVlad Serebrennikov   struct A {
911d358b2deSVlad Serebrennikov     typedef int T; // #cwg56-typedef-int-T-first
912d358b2deSVlad Serebrennikov     typedef int T;
913d358b2deSVlad Serebrennikov     // expected-error@-1 {{redefinition of 'T'}}
914d358b2deSVlad Serebrennikov     //   expected-note@#cwg56-typedef-int-T-first {{previous definition is here}}
915d358b2deSVlad Serebrennikov   };
916d358b2deSVlad Serebrennikov   struct B {
917d358b2deSVlad Serebrennikov     struct X;
918d358b2deSVlad Serebrennikov     typedef X X; // #cwg56-typedef-X-X-first
919d358b2deSVlad Serebrennikov     typedef X X;
920d358b2deSVlad Serebrennikov     // expected-error@-1 {{redefinition of 'X'}}
921d358b2deSVlad Serebrennikov     //   expected-note@#cwg56-typedef-X-X-first {{previous definition is here}}
922d358b2deSVlad Serebrennikov   };
923463e61a0SVlad Serebrennikov } // namespace cwg56
924d358b2deSVlad Serebrennikov 
925d358b2deSVlad Serebrennikov namespace cwg58 { // cwg58: 3.1
926d358b2deSVlad Serebrennikov   // FIXME: Ideally, we should have a CodeGen test for this.
927d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
928d358b2deSVlad Serebrennikov   enum E1 { E1_0 = 0, E1_1 = 1 };
929d358b2deSVlad Serebrennikov   enum E2 { E2_0 = 0, E2_m1 = -1 };
930d358b2deSVlad Serebrennikov   struct X { E1 e1 : 1; E2 e2 : 1; };
931d358b2deSVlad Serebrennikov   static_assert(X{E1_1, E2_m1}.e1 == 1, "");
932d358b2deSVlad Serebrennikov   static_assert(X{E1_1, E2_m1}.e2 == -1, "");
933d358b2deSVlad Serebrennikov #endif
934463e61a0SVlad Serebrennikov } // namespace cwg58
935d358b2deSVlad Serebrennikov 
93614ba3f9dSVlad Serebrennikov namespace cwg59 { // cwg59: 2.7
937d358b2deSVlad Serebrennikov #pragma clang diagnostic push
938d358b2deSVlad Serebrennikov #pragma clang diagnostic ignored "-Wdeprecated-volatile"
939d358b2deSVlad Serebrennikov   template<typename T> struct convert_to { operator T() const; };
940d358b2deSVlad Serebrennikov   struct A {}; // #cwg59-A
941d358b2deSVlad Serebrennikov   struct B : A {}; // #cwg59-B
942d358b2deSVlad Serebrennikov 
943d358b2deSVlad Serebrennikov   A a1 = convert_to<A>();
944d358b2deSVlad Serebrennikov   A a2 = convert_to<A&>();
945d358b2deSVlad Serebrennikov   A a3 = convert_to<const A>();
946d358b2deSVlad Serebrennikov   A a4 = convert_to<const volatile A>();
947d358b2deSVlad Serebrennikov   // cxx98-14-error@-1 {{no viable constructor copying variable of type 'const volatile cwg59::A'}}
948d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg59-A {{candidate constructor (the implicit copy constructor) not viable: 1st argument ('const volatile cwg59::A') would lose volatile qualifier}}
949d358b2deSVlad Serebrennikov   //   cxx11-14-note@#cwg59-A {{candidate constructor (the implicit move constructor) not viable: 1st argument ('const volatile cwg59::A') would lose const and volatile qualifiers}}
950d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg59-A {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}}
951d358b2deSVlad Serebrennikov   A a5 = convert_to<const volatile A&>();
952d358b2deSVlad Serebrennikov   // expected-error@-1 {{no viable constructor copying variable of type 'const volatile cwg59::A'}}
953d358b2deSVlad Serebrennikov   //   expected-note@#cwg59-A {{candidate constructor (the implicit copy constructor) not viable: 1st argument ('const volatile cwg59::A') would lose volatile qualifier}}
954d358b2deSVlad Serebrennikov   //   since-cxx11-note@#cwg59-A {{candidate constructor (the implicit move constructor) not viable: 1st argument ('const volatile cwg59::A') would lose const and volatile qualifiers}}
955d358b2deSVlad Serebrennikov   //   expected-note@#cwg59-A {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}}
956d358b2deSVlad Serebrennikov 
957d358b2deSVlad Serebrennikov   B b1 = convert_to<B>();
958d358b2deSVlad Serebrennikov   B b2 = convert_to<B&>();
959d358b2deSVlad Serebrennikov   B b3 = convert_to<const B>();
960d358b2deSVlad Serebrennikov   B b4 = convert_to<const volatile B>();
961d358b2deSVlad Serebrennikov   // cxx98-14-error@-1 {{no viable constructor copying variable of type 'const volatile cwg59::B'}}
962d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg59-B {{candidate constructor (the implicit copy constructor) not viable: 1st argument ('const volatile cwg59::B') would lose volatile qualifier}}
963d358b2deSVlad Serebrennikov   //   cxx11-14-note@#cwg59-B {{candidate constructor (the implicit move constructor) not viable: 1st argument ('const volatile cwg59::B') would lose const and volatile qualifiers}}
964d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg59-B {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}}
965d358b2deSVlad Serebrennikov   B b5 = convert_to<const volatile B&>();
966d358b2deSVlad Serebrennikov   // expected-error@-1 {{no viable constructor copying variable of type 'const volatile cwg59::B'}}
967d358b2deSVlad Serebrennikov   //   expected-note@#cwg59-B {{candidate constructor (the implicit copy constructor) not viable: 1st argument ('const volatile cwg59::B') would lose volatile qualifier}}
968d358b2deSVlad Serebrennikov   //   since-cxx11-note@#cwg59-B {{candidate constructor (the implicit move constructor) not viable: 1st argument ('const volatile cwg59::B') would lose const and volatile qualifiers}}
969d358b2deSVlad Serebrennikov   //   expected-note@#cwg59-B {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}}
970d358b2deSVlad Serebrennikov 
971d358b2deSVlad Serebrennikov   A c1 = convert_to<B>();
972d358b2deSVlad Serebrennikov   A c2 = convert_to<B&>();
973d358b2deSVlad Serebrennikov   A c3 = convert_to<const B>();
974d358b2deSVlad Serebrennikov   A c4 = convert_to<const volatile B>();
975d358b2deSVlad Serebrennikov   // expected-error@-1 {{no viable constructor copying variable of type 'const volatile cwg59::B'}}
976d358b2deSVlad Serebrennikov   //   expected-note@#cwg59-A {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'const volatile cwg59::B' to 'const A &' for 1st argument}}
977d358b2deSVlad Serebrennikov   //   since-cxx11-note@#cwg59-A {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'const volatile cwg59::B' to 'A &&' for 1st argument}}
978d358b2deSVlad Serebrennikov   //   expected-note@#cwg59-A {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}}
979d358b2deSVlad Serebrennikov   A c5 = convert_to<const volatile B&>();
980d358b2deSVlad Serebrennikov   // expected-error@-1 {{no viable constructor copying variable of type 'const volatile cwg59::B'}}
981d358b2deSVlad Serebrennikov   //   expected-note@#cwg59-A {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'const volatile cwg59::B' to 'const A &' for 1st argument}}
982d358b2deSVlad Serebrennikov   //   since-cxx11-note@#cwg59-A {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'const volatile cwg59::B' to 'A &&' for 1st argument}}
983d358b2deSVlad Serebrennikov   //   expected-note@#cwg59-A {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}}
984d358b2deSVlad Serebrennikov 
985d358b2deSVlad Serebrennikov   int n1 = convert_to<int>();
986d358b2deSVlad Serebrennikov   int n2 = convert_to<int&>();
987d358b2deSVlad Serebrennikov   int n3 = convert_to<const int>();
988d358b2deSVlad Serebrennikov   int n4 = convert_to<const volatile int>();
989d358b2deSVlad Serebrennikov   int n5 = convert_to<const volatile int&>();
990d358b2deSVlad Serebrennikov #pragma clang diagnostic pop
991463e61a0SVlad Serebrennikov } // namespace cwg59
992d358b2deSVlad Serebrennikov 
99314ba3f9dSVlad Serebrennikov namespace cwg60 { // cwg60: 2.7
994d358b2deSVlad Serebrennikov   void f(int &);
995d358b2deSVlad Serebrennikov   int &f(...);
996d358b2deSVlad Serebrennikov   const int k = 0;
997d358b2deSVlad Serebrennikov   int &n = f(k);
998463e61a0SVlad Serebrennikov } // namespace cwg60
999d358b2deSVlad Serebrennikov 
1000d358b2deSVlad Serebrennikov namespace cwg61 { // cwg61: 3.4
1001d358b2deSVlad Serebrennikov   struct X {
1002d358b2deSVlad Serebrennikov     static void f();
1003d358b2deSVlad Serebrennikov   } x;
1004d358b2deSVlad Serebrennikov   struct Y {
1005d358b2deSVlad Serebrennikov     static void f();
1006d358b2deSVlad Serebrennikov     static void f(int);
1007d358b2deSVlad Serebrennikov   } y;
1008d358b2deSVlad Serebrennikov   // This is (presumably) valid, because x.f does not refer to an overloaded
1009d358b2deSVlad Serebrennikov   // function name.
1010d358b2deSVlad Serebrennikov   void (*p)() = &x.f;
1011d358b2deSVlad Serebrennikov   void (*q)() = &y.f;
1012d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot create a non-constant pointer to member function}}
1013d358b2deSVlad Serebrennikov   void (*r)() = y.f;
1014d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot create a non-constant pointer to member function}}
1015463e61a0SVlad Serebrennikov } // namespace cwg61
1016d358b2deSVlad Serebrennikov 
1017d358b2deSVlad Serebrennikov namespace cwg62 { // cwg62: 2.9
1018d358b2deSVlad Serebrennikov   struct A {
1019d358b2deSVlad Serebrennikov     struct { int n; } b;
1020d358b2deSVlad Serebrennikov   };
1021d358b2deSVlad Serebrennikov   template<typename T> struct X {};
1022d358b2deSVlad Serebrennikov   template<typename T> T get() { return get<T>(); }
1023d358b2deSVlad Serebrennikov   template<typename T> int take(T) { return 0; }
1024d358b2deSVlad Serebrennikov 
1025d358b2deSVlad Serebrennikov   X<A> x1;
1026d358b2deSVlad Serebrennikov   A a = get<A>();
1027d358b2deSVlad Serebrennikov 
1028d358b2deSVlad Serebrennikov   typedef struct { } *NoNameForLinkagePtr; // #cwg62-unnamed
1029d358b2deSVlad Serebrennikov   NoNameForLinkagePtr noNameForLinkagePtr;
1030d358b2deSVlad Serebrennikov 
1031d358b2deSVlad Serebrennikov   struct Danger {
1032d358b2deSVlad Serebrennikov     NoNameForLinkagePtr p;
1033d358b2deSVlad Serebrennikov   };
1034d358b2deSVlad Serebrennikov 
1035d358b2deSVlad Serebrennikov   X<NoNameForLinkagePtr> x2;
1036d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{template argument uses unnamed type}}
1037d358b2deSVlad Serebrennikov   //   cxx98-note@#cwg62-unnamed {{unnamed type used in template argument was declared here}}
1038d358b2deSVlad Serebrennikov   X<const NoNameForLinkagePtr> x3;
1039d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{template argument uses unnamed type}}
1040d358b2deSVlad Serebrennikov   //   cxx98-note@#cwg62-unnamed {{unnamed type used in template argument was declared here}}
1041d358b2deSVlad Serebrennikov   NoNameForLinkagePtr p1 = get<NoNameForLinkagePtr>();
1042d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{template argument uses unnamed type}}
1043d358b2deSVlad Serebrennikov   //   cxx98-note@#cwg62-unnamed {{unnamed type used in template argument was declared here}}
1044d358b2deSVlad Serebrennikov   NoNameForLinkagePtr p2 = get<const NoNameForLinkagePtr>();
1045d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{template argument uses unnamed type}}
1046d358b2deSVlad Serebrennikov   //   cxx98-note@#cwg62-unnamed {{unnamed type used in template argument was declared here}}
1047d358b2deSVlad Serebrennikov   int n1 = take(noNameForLinkagePtr);
1048d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{template argument uses unnamed type}}
1049d358b2deSVlad Serebrennikov   //   cxx98-note@#cwg62-unnamed {{unnamed type used in template argument was declared here}}
1050d358b2deSVlad Serebrennikov 
1051d358b2deSVlad Serebrennikov   X<Danger> x4;
1052d358b2deSVlad Serebrennikov 
1053d358b2deSVlad Serebrennikov   void f() {
1054d358b2deSVlad Serebrennikov     struct NoLinkage {};
1055d358b2deSVlad Serebrennikov     X<NoLinkage> a;
1056d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{template argument uses local type }}
1057d358b2deSVlad Serebrennikov     X<const NoLinkage> b;
1058d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{template argument uses local type }}
1059d358b2deSVlad Serebrennikov     get<NoLinkage>();
1060d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{template argument uses local type }}
1061d358b2deSVlad Serebrennikov     get<const NoLinkage>();
1062d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{template argument uses local type }}
1063d358b2deSVlad Serebrennikov     X<void (*)(NoLinkage A::*)> c;
1064d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{template argument uses local type }}
1065d358b2deSVlad Serebrennikov     X<int NoLinkage::*> d;
1066d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{template argument uses local type }}
1067d358b2deSVlad Serebrennikov   }
1068463e61a0SVlad Serebrennikov } // namespace cwg62
1069d358b2deSVlad Serebrennikov 
107014ba3f9dSVlad Serebrennikov namespace cwg63 { // cwg63: 2.7
1071d358b2deSVlad Serebrennikov   template<typename T> struct S { typename T::error e; };
1072d358b2deSVlad Serebrennikov   extern S<int> *p;
1073d358b2deSVlad Serebrennikov   void *q = p;
1074463e61a0SVlad Serebrennikov } // namespace cwg63
1075d358b2deSVlad Serebrennikov 
107614ba3f9dSVlad Serebrennikov namespace cwg64 { // cwg64: 2.7
1077d358b2deSVlad Serebrennikov   template<class T> void f(T);
1078d358b2deSVlad Serebrennikov   template<class T> void f(T*);
1079d358b2deSVlad Serebrennikov   template<> void f(int*);
1080d358b2deSVlad Serebrennikov   template<> void f<int>(int*);
1081d358b2deSVlad Serebrennikov   template<> void f(int);
1082463e61a0SVlad Serebrennikov } // namespace cwg64
1083d358b2deSVlad Serebrennikov 
1084d358b2deSVlad Serebrennikov // cwg65: na
1085d358b2deSVlad Serebrennikov 
1086d358b2deSVlad Serebrennikov namespace cwg66 { // cwg66: no
1087d358b2deSVlad Serebrennikov   namespace X {
1088d358b2deSVlad Serebrennikov     int f(int n); // #cwg66-f-first
1089d358b2deSVlad Serebrennikov   }
1090d358b2deSVlad Serebrennikov   using X::f;
1091d358b2deSVlad Serebrennikov   namespace X {
1092d358b2deSVlad Serebrennikov     int f(int n = 0);
1093d358b2deSVlad Serebrennikov     int f(int, int);
1094d358b2deSVlad Serebrennikov   }
1095d358b2deSVlad Serebrennikov   // FIXME: The first two calls here should be accepted.
1096d358b2deSVlad Serebrennikov   int a = f();
1097d358b2deSVlad Serebrennikov   // expected-error@-1 {{no matching function for call to 'f'}}
1098d358b2deSVlad Serebrennikov   //   expected-note@#cwg66-f-first {{candidate function not viable: requires single argument 'n', but no arguments were provided}}
1099d358b2deSVlad Serebrennikov   int b = f(1);
1100d358b2deSVlad Serebrennikov   int c = f(1, 2);
1101d358b2deSVlad Serebrennikov   // expected-error@-1 {{no matching function for call to 'f'}}
1102d358b2deSVlad Serebrennikov   //   expected-note@#cwg66-f-first {{candidate function not viable: requires single argument 'n', but 2 arguments were provided}}
1103463e61a0SVlad Serebrennikov } // namespace cwg66
1104d358b2deSVlad Serebrennikov 
1105d358b2deSVlad Serebrennikov // cwg67: na
1106d358b2deSVlad Serebrennikov 
1107d358b2deSVlad Serebrennikov namespace cwg68 { // cwg68: 2.8
1108d358b2deSVlad Serebrennikov   template<typename T> struct X {};
1109d358b2deSVlad Serebrennikov   struct ::cwg68::X<int> x1;
1110d358b2deSVlad Serebrennikov   struct ::cwg68::template X<int> x2;
1111d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{'template' keyword outside of a template}}
1112d358b2deSVlad Serebrennikov   struct Y {
1113d358b2deSVlad Serebrennikov     friend struct X<int>;
1114d358b2deSVlad Serebrennikov     friend struct ::cwg68::X<char>;
1115d358b2deSVlad Serebrennikov     friend struct ::cwg68::template X<double>;
1116d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{'template' keyword outside of a template}}
1117d358b2deSVlad Serebrennikov   };
1118d358b2deSVlad Serebrennikov   template<typename>
1119d358b2deSVlad Serebrennikov   struct Z {
1120d358b2deSVlad Serebrennikov     friend struct ::cwg68::template X<double>;
1121d358b2deSVlad Serebrennikov     friend typename ::cwg68::X<double>;
1122d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{unelaborated friend declaration is a C++11 extension; specify 'struct' to befriend 'typename ::cwg68::X<double>'}}
1123d358b2deSVlad Serebrennikov   };
1124463e61a0SVlad Serebrennikov } // namespace cwg68
1125d358b2deSVlad Serebrennikov 
1126d358b2deSVlad Serebrennikov namespace cwg69 { // cwg69: 9
1127d358b2deSVlad Serebrennikov   template<typename T> static void f() {} // #cwg69-f
1128d358b2deSVlad Serebrennikov   // FIXME: Should we warn here?
1129d358b2deSVlad Serebrennikov   inline void g() { f<int>(); }
1130d358b2deSVlad Serebrennikov   extern template void f<char>();
1131d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{extern templates are a C++11 extension}}
1132d358b2deSVlad Serebrennikov   // expected-error@-2 {{explicit instantiation declaration of 'f' with internal linkage}}
1133d358b2deSVlad Serebrennikov   template<void(*)()> struct Q {};
1134d358b2deSVlad Serebrennikov   Q<&f<int> > q;
1135d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{non-type template argument referring to function 'f<int>' with internal linkage is a C++11 extension}}
1136d358b2deSVlad Serebrennikov   //   cxx98-note@#cwg69-f {{non-type template argument refers to function here}}
1137463e61a0SVlad Serebrennikov } // namespace cwg69
1138d358b2deSVlad Serebrennikov 
113914ba3f9dSVlad Serebrennikov namespace cwg70 { // cwg70: 2.7
1140d358b2deSVlad Serebrennikov   template<int> struct A {};
1141d358b2deSVlad Serebrennikov   template<int I, int J> int f(int (&)[I + J], A<I>, A<J>);
1142d358b2deSVlad Serebrennikov   int arr[7];
1143d358b2deSVlad Serebrennikov   int k = f(arr, A<3>(), A<4>());
1144463e61a0SVlad Serebrennikov } // namespace cwg70
1145d358b2deSVlad Serebrennikov 
1146d358b2deSVlad Serebrennikov // cwg71: na
1147d358b2deSVlad Serebrennikov // cwg72: dup 69
1148d358b2deSVlad Serebrennikov 
1149d358b2deSVlad Serebrennikov namespace cwg73 { // cwg73: sup 1652
1150463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
1151d358b2deSVlad Serebrennikov   int a, b;
1152d358b2deSVlad Serebrennikov   static_assert(&a + 1 != &b, "");
1153eff12650SVlad Serebrennikov   // since-cxx11-error@-1 {{static assertion expression is not an integral constant expression}}
1154eff12650SVlad Serebrennikov   //   since-cxx11-note@-2 {{comparison against pointer '&a + 1' that points past the end of a complete object has unspecified value}}
1155d358b2deSVlad Serebrennikov #endif
1156463e61a0SVlad Serebrennikov } // namespace cwg73
1157d358b2deSVlad Serebrennikov 
115814ba3f9dSVlad Serebrennikov namespace cwg74 { // cwg74: 2.7
1159d358b2deSVlad Serebrennikov   enum E { k = 5 };
1160d358b2deSVlad Serebrennikov   int (*p)[k] = new int[k][k];
1161463e61a0SVlad Serebrennikov } // namespace cwg74
1162d358b2deSVlad Serebrennikov 
116314ba3f9dSVlad Serebrennikov namespace cwg75 { // cwg75: 2.7
1164d358b2deSVlad Serebrennikov   struct S {
1165d358b2deSVlad Serebrennikov     static int n = 0;
1166d358b2deSVlad Serebrennikov     // expected-error@-1 {{non-const static data member must be initialized out of line}}
1167d358b2deSVlad Serebrennikov   };
1168463e61a0SVlad Serebrennikov } // namespace cwg75
1169d358b2deSVlad Serebrennikov 
117014ba3f9dSVlad Serebrennikov namespace cwg76 { // cwg76: 2.7
1171d358b2deSVlad Serebrennikov   const volatile int n = 1;
1172d358b2deSVlad Serebrennikov   static_assert(n, "");
1173d358b2deSVlad Serebrennikov   // expected-error@-1 {{static assertion expression is not an integral constant expression}}
1174d358b2deSVlad Serebrennikov   //   expected-note@-2 {{read of volatile-qualified type 'const volatile int' is not allowed in a constant expression}}
1175463e61a0SVlad Serebrennikov } // namespace cwg76
1176d358b2deSVlad Serebrennikov 
117714ba3f9dSVlad Serebrennikov namespace cwg77 { // cwg77: 2.7
1178d358b2deSVlad Serebrennikov   struct A {
1179d358b2deSVlad Serebrennikov     struct B {};
1180d358b2deSVlad Serebrennikov     friend struct B;
1181d358b2deSVlad Serebrennikov   };
1182463e61a0SVlad Serebrennikov } // namespace cwg77
1183d358b2deSVlad Serebrennikov 
1184d358b2deSVlad Serebrennikov namespace cwg78 { // cwg78: sup ????
1185d358b2deSVlad Serebrennikov   // Under CWG78, this is valid, because 'k' has static storage duration, so is
1186d358b2deSVlad Serebrennikov   // zero-initialized.
1187d358b2deSVlad Serebrennikov   const int k;
1188d358b2deSVlad Serebrennikov   // expected-error@-1 {{default initialization of an object of const type 'const int'}}
1189463e61a0SVlad Serebrennikov } // namespace cwg78
1190d358b2deSVlad Serebrennikov 
1191d358b2deSVlad Serebrennikov // cwg79: na
1192d358b2deSVlad Serebrennikov 
1193d358b2deSVlad Serebrennikov namespace cwg80 { // cwg80: 2.9
1194d358b2deSVlad Serebrennikov   struct A {
1195d358b2deSVlad Serebrennikov     int A;
1196d358b2deSVlad Serebrennikov   };
1197d358b2deSVlad Serebrennikov   struct B {
1198d358b2deSVlad Serebrennikov     static int B;
1199d358b2deSVlad Serebrennikov     // expected-error@-1 {{member 'B' has the same name as its class}}
1200d358b2deSVlad Serebrennikov   };
1201d358b2deSVlad Serebrennikov   struct C {
1202d358b2deSVlad Serebrennikov     int C;
1203d358b2deSVlad Serebrennikov     // expected-error@-1 {{member 'C' has the same name as its class}}
1204d358b2deSVlad Serebrennikov     C();
1205d358b2deSVlad Serebrennikov   };
1206d358b2deSVlad Serebrennikov   struct D {
1207d358b2deSVlad Serebrennikov     D();
1208d358b2deSVlad Serebrennikov     int D;
1209d358b2deSVlad Serebrennikov     // expected-error@-1 {{member 'D' has the same name as its class}}
1210d358b2deSVlad Serebrennikov   };
1211463e61a0SVlad Serebrennikov } // namespace cwg80
1212d358b2deSVlad Serebrennikov 
1213d358b2deSVlad Serebrennikov // cwg81: na
1214d358b2deSVlad Serebrennikov // cwg82: dup 48
1215d358b2deSVlad Serebrennikov 
121614ba3f9dSVlad Serebrennikov namespace cwg83 { // cwg83: 2.7
1217d358b2deSVlad Serebrennikov   int &f(const char*);
1218d358b2deSVlad Serebrennikov   char &f(char *);
1219d358b2deSVlad Serebrennikov   int &k = f("foo");
1220463e61a0SVlad Serebrennikov } // namespace cwg83
1221d358b2deSVlad Serebrennikov 
122214ba3f9dSVlad Serebrennikov namespace cwg84 { // cwg84: 2.7
1223d358b2deSVlad Serebrennikov   struct B;
1224d358b2deSVlad Serebrennikov   struct A { operator B() const; };
1225d358b2deSVlad Serebrennikov   struct C {};
1226d358b2deSVlad Serebrennikov   struct B {
1227d358b2deSVlad Serebrennikov     B(B&); // #cwg84-copy-ctor
1228d358b2deSVlad Serebrennikov     B(C); // #cwg84-ctor-from-C
1229d358b2deSVlad Serebrennikov     operator C() const;
1230d358b2deSVlad Serebrennikov   };
1231d358b2deSVlad Serebrennikov   A a;
1232d358b2deSVlad Serebrennikov   // Cannot use B(C) / operator C() pair to construct the B from the B temporary
1233d358b2deSVlad Serebrennikov   // here. In C++17, we initialize the B object directly using 'A::operator B()'.
1234d358b2deSVlad Serebrennikov   B b = a;
1235d358b2deSVlad Serebrennikov   // cxx98-14-error@-1 {{no viable constructor copying variable of type 'B'}}
1236d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg84-copy-ctor {{candidate constructor not viable: expects an lvalue for 1st argument}}
1237d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg84-ctor-from-C {{candidate constructor not viable: no known conversion from 'B' to 'C' for 1st argument}}
1238463e61a0SVlad Serebrennikov } // namespace cwg84
1239d358b2deSVlad Serebrennikov 
1240d358b2deSVlad Serebrennikov namespace cwg85 { // cwg85: 3.4
1241d358b2deSVlad Serebrennikov   struct A {
1242d358b2deSVlad Serebrennikov     struct B;
1243d358b2deSVlad Serebrennikov     struct B {}; // #cwg85-B-def
1244d358b2deSVlad Serebrennikov     struct B;
1245d358b2deSVlad Serebrennikov     // expected-error@-1 {{class member cannot be redeclared}}
1246d358b2deSVlad Serebrennikov     //   expected-note@#cwg85-B-def {{previous declaration is here}}
1247d358b2deSVlad Serebrennikov 
1248d358b2deSVlad Serebrennikov     union U;
1249d358b2deSVlad Serebrennikov     union U {}; // #cwg85-U-def
1250d358b2deSVlad Serebrennikov     union U;
1251d358b2deSVlad Serebrennikov     // expected-error@-1 {{class member cannot be redeclared}}
1252d358b2deSVlad Serebrennikov     //   expected-note@#cwg85-U-def {{previous declaration is here}}
1253d358b2deSVlad Serebrennikov 
1254d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
1255d358b2deSVlad Serebrennikov     enum E1 : int;
1256d358b2deSVlad Serebrennikov     enum E1 : int { e1 }; // #cwg85-E1-def
1257d358b2deSVlad Serebrennikov     enum E1 : int;
1258eff12650SVlad Serebrennikov     // since-cxx11-error@-1 {{class member cannot be redeclared}}
1259eff12650SVlad Serebrennikov     //   since-cxx11-note@#cwg85-E1-def {{previous declaration is here}}
1260d358b2deSVlad Serebrennikov 
1261d358b2deSVlad Serebrennikov     enum class E2;
1262d358b2deSVlad Serebrennikov     enum class E2 { e2 }; // #cwg85-E2-def
1263d358b2deSVlad Serebrennikov     enum class E2;
1264eff12650SVlad Serebrennikov     // since-cxx11-error@-1 {{class member cannot be redeclared}}
1265eff12650SVlad Serebrennikov     //   since-cxx11-note@#cwg85-E2-def {{previous declaration is here}}
1266d358b2deSVlad Serebrennikov #endif
1267d358b2deSVlad Serebrennikov   };
1268d358b2deSVlad Serebrennikov 
1269d358b2deSVlad Serebrennikov   template <typename T>
1270d358b2deSVlad Serebrennikov   struct C {
1271d358b2deSVlad Serebrennikov     struct B {}; // #cwg85-C-B-def
1272d358b2deSVlad Serebrennikov     struct B;
1273d358b2deSVlad Serebrennikov     // expected-error@-1 {{class member cannot be redeclared}}
1274d358b2deSVlad Serebrennikov     //   expected-note@#cwg85-C-B-def {{previous declaration is here}}
1275d358b2deSVlad Serebrennikov   };
1276463e61a0SVlad Serebrennikov } // namespace cwg85
1277d358b2deSVlad Serebrennikov 
1278d358b2deSVlad Serebrennikov // cwg86: dup 446
1279d358b2deSVlad Serebrennikov 
1280d358b2deSVlad Serebrennikov namespace cwg87 { // cwg87: no
1281d358b2deSVlad Serebrennikov   // FIXME: Superseded by cwg1975
1282d358b2deSVlad Serebrennikov   template<typename T> struct X {};
1283d358b2deSVlad Serebrennikov   // FIXME: This is invalid.
1284d358b2deSVlad Serebrennikov   X<void() throw()> x;
1285d358b2deSVlad Serebrennikov   // This is valid under cwg87 but not under cwg1975.
1286d358b2deSVlad Serebrennikov   X<void(void() throw())> y;
1287463e61a0SVlad Serebrennikov } // namespace cwg87
1288d358b2deSVlad Serebrennikov 
1289d358b2deSVlad Serebrennikov namespace cwg88 { // cwg88: 2.8
1290d358b2deSVlad Serebrennikov   template<typename T> struct S {
1291d358b2deSVlad Serebrennikov     static const int a = 1; // #cwg88-a
1292d358b2deSVlad Serebrennikov     static const int b;
1293d358b2deSVlad Serebrennikov   };
1294d358b2deSVlad Serebrennikov   template<> const int S<int>::a = 4;
1295d358b2deSVlad Serebrennikov   // expected-error@-1 {{static data member 'a' already has an initializer}}
1296d358b2deSVlad Serebrennikov   //   expected-note@#cwg88-a {{previous initialization is here}}
1297d358b2deSVlad Serebrennikov   template<> const int S<int>::b = 4;
1298463e61a0SVlad Serebrennikov } // namespace cwg88
1299d358b2deSVlad Serebrennikov 
1300d358b2deSVlad Serebrennikov // cwg89: na
1301d358b2deSVlad Serebrennikov 
130214ba3f9dSVlad Serebrennikov namespace cwg90 { // cwg90: 2.7
1303d358b2deSVlad Serebrennikov   struct A {
1304d358b2deSVlad Serebrennikov     template<typename T> friend void cwg90_f(T);
1305d358b2deSVlad Serebrennikov   };
1306d358b2deSVlad Serebrennikov   struct B : A {
1307d358b2deSVlad Serebrennikov     template<typename T> friend void cwg90_g(T);
1308d358b2deSVlad Serebrennikov     struct C {};
1309d358b2deSVlad Serebrennikov     union D {};
1310d358b2deSVlad Serebrennikov   };
1311d358b2deSVlad Serebrennikov   struct E : B {};
1312d358b2deSVlad Serebrennikov   struct F : B::C {};
1313d358b2deSVlad Serebrennikov 
1314d358b2deSVlad Serebrennikov   void test() {
1315d358b2deSVlad Serebrennikov     cwg90_f(A());
1316d358b2deSVlad Serebrennikov     cwg90_f(B());
1317d358b2deSVlad Serebrennikov     cwg90_f(B::C());
1318d358b2deSVlad Serebrennikov     // expected-error@-1 {{use of undeclared identifier 'cwg90_f'}}
1319d358b2deSVlad Serebrennikov     cwg90_f(B::D());
1320d358b2deSVlad Serebrennikov     // expected-error@-1 {{use of undeclared identifier 'cwg90_f'}}
1321d358b2deSVlad Serebrennikov     cwg90_f(E());
1322d358b2deSVlad Serebrennikov     cwg90_f(F());
1323d358b2deSVlad Serebrennikov     // expected-error@-1 {{use of undeclared identifier 'cwg90_f'}}
1324d358b2deSVlad Serebrennikov 
1325d358b2deSVlad Serebrennikov     cwg90_g(A());
1326d358b2deSVlad Serebrennikov     // expected-error@-1 {{use of undeclared identifier 'cwg90_g'}}
1327d358b2deSVlad Serebrennikov     cwg90_g(B());
1328d358b2deSVlad Serebrennikov     cwg90_g(B::C());
1329d358b2deSVlad Serebrennikov     cwg90_g(B::D());
1330d358b2deSVlad Serebrennikov     cwg90_g(E());
1331d358b2deSVlad Serebrennikov     cwg90_g(F());
1332d358b2deSVlad Serebrennikov     // expected-error@-1 {{use of undeclared identifier 'cwg90_g'}}
1333d358b2deSVlad Serebrennikov   }
1334463e61a0SVlad Serebrennikov } // namespace cwg90
1335d358b2deSVlad Serebrennikov 
133614ba3f9dSVlad Serebrennikov namespace cwg91 { // cwg91: 2.7
1337d358b2deSVlad Serebrennikov   union U { friend int f(U); };
1338d358b2deSVlad Serebrennikov   int k = f(U());
1339463e61a0SVlad Serebrennikov } // namespace cwg91
1340d358b2deSVlad Serebrennikov 
1341d358b2deSVlad Serebrennikov namespace cwg92 { // cwg92: 4 c++17
1342d358b2deSVlad Serebrennikov   void f() throw(int, float);
1343d358b2deSVlad Serebrennikov   // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}}
1344d358b2deSVlad Serebrennikov   //   since-cxx17-note@-2 {{use 'noexcept(false)' instead}}
1345d358b2deSVlad Serebrennikov   void (*p)() throw(int) = &f; // #cwg92-p
1346d358b2deSVlad Serebrennikov   // since-cxx17-error@#cwg92-p {{ISO C++17 does not allow dynamic exception specifications}}
1347d358b2deSVlad Serebrennikov   //   since-cxx17-note@#cwg92-p {{use 'noexcept(false)' instead}}
1348d358b2deSVlad Serebrennikov   // cxx98-14-error@#cwg92-p {{target exception specification is not superset of source}}
1349d358b2deSVlad Serebrennikov   // since-cxx17-warning@#cwg92-p {{target exception specification is not superset of source}}
1350d358b2deSVlad Serebrennikov   void (*q)() throw(int);
1351d358b2deSVlad Serebrennikov   // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}}
1352d358b2deSVlad Serebrennikov   //   since-cxx17-note@-2 {{use 'noexcept(false)' instead}}
1353d358b2deSVlad Serebrennikov   void (**pp)() throw() = &q;
1354d358b2deSVlad Serebrennikov   // cxx98-14-error@-1 {{exception specifications are not allowed beyond a single level of indirection}}
1355d358b2deSVlad Serebrennikov   // since-cxx17-error@-2 {{cannot initialize a variable of type 'void (**)() throw()' with an rvalue of type 'void (**)() throw(int)'}}
1356d358b2deSVlad Serebrennikov 
1357d358b2deSVlad Serebrennikov   void g(void() throw()); // #cwg92-g
1358d358b2deSVlad Serebrennikov   // cxx98-14-warning@-1 {{mangled name of 'g' will change in C++17 due to non-throwing exception specification in function signature}}
1359d358b2deSVlad Serebrennikov   void h() throw() {
1360d358b2deSVlad Serebrennikov     g(f);
1361d358b2deSVlad Serebrennikov     // cxx98-14-error@-1 {{target exception specification is not superset of source}}
1362d358b2deSVlad Serebrennikov     // since-cxx17-error@-2 {{no matching function for call to 'g'}}
1363d358b2deSVlad Serebrennikov     //   since-cxx17-note@#cwg92-g {{candidate function not viable: no known conversion from 'void () throw(int, float)' to 'void (*)() throw()' for 1st argument}}
1364d358b2deSVlad Serebrennikov     g(q);
1365d358b2deSVlad Serebrennikov     // cxx98-14-error@-1 {{target exception specification is not superset of source}}
1366d358b2deSVlad Serebrennikov     // since-cxx17-error@-2 {{no matching function for call to 'g'}}
1367d358b2deSVlad Serebrennikov     //   since-cxx17-note@#cwg92-g {{candidate function not viable: no known conversion from 'void (*)() throw(int)' to 'void (*)() throw()' for 1st argument}}
1368d358b2deSVlad Serebrennikov   }
1369d358b2deSVlad Serebrennikov 
1370d358b2deSVlad Serebrennikov   // Prior to C++17, this is OK because the exception specification is not
1371d358b2deSVlad Serebrennikov   // considered in this context. In C++17, we *do* perform an implicit
1372d358b2deSVlad Serebrennikov   // conversion (which performs initialization), and the exception specification
1373d358b2deSVlad Serebrennikov   // is part of the type of the parameter, so this is invalid.
1374*e29c0858SMatheus Izvekov   template<void() throw()> struct X {}; // since-cxx17-note {{template parameter is declared here}}
1375d358b2deSVlad Serebrennikov   X<&f> xp;
1376d358b2deSVlad Serebrennikov   // since-cxx17-error@-1 {{value of type 'void (*)() throw(int, float)' is not implicitly convertible to 'void (*)() throw()'}}
1377d358b2deSVlad Serebrennikov 
1378d358b2deSVlad Serebrennikov   template<void() throw(int)> struct Y {};
1379d358b2deSVlad Serebrennikov   // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}}
1380d358b2deSVlad Serebrennikov   //   since-cxx17-note@-2 {{use 'noexcept(false)' instead}}
1381d358b2deSVlad Serebrennikov   Y<&h> yp; // ok
1382463e61a0SVlad Serebrennikov } // namespace cwg92
1383d358b2deSVlad Serebrennikov 
1384d358b2deSVlad Serebrennikov // cwg93: na
1385d358b2deSVlad Serebrennikov 
138614ba3f9dSVlad Serebrennikov namespace cwg94 { // cwg94: 2.7
1387d358b2deSVlad Serebrennikov   struct A { static const int n = 5; };
1388d358b2deSVlad Serebrennikov   int arr[A::n];
1389463e61a0SVlad Serebrennikov } // namespace cwg94
1390d358b2deSVlad Serebrennikov 
1391d358b2deSVlad Serebrennikov namespace cwg95 { // cwg95: 3.3
1392d358b2deSVlad Serebrennikov   struct A;
1393d358b2deSVlad Serebrennikov   struct B;
1394d358b2deSVlad Serebrennikov   namespace N {
1395d358b2deSVlad Serebrennikov     class C {
1396d358b2deSVlad Serebrennikov       friend struct A;
1397d358b2deSVlad Serebrennikov       friend struct B;
1398d358b2deSVlad Serebrennikov       static void f(); // #cwg95-C-f
1399d358b2deSVlad Serebrennikov     };
1400d358b2deSVlad Serebrennikov     struct A *p; // cwg95::A, not cwg95::N::A.
1401d358b2deSVlad Serebrennikov   }
1402d358b2deSVlad Serebrennikov   A *q = N::p; // ok, same type
1403d358b2deSVlad Serebrennikov   struct B { void f() { N::C::f(); } };
1404d358b2deSVlad Serebrennikov   // expected-error@-1 {{'f' is a private member of 'cwg95::N::C'}}
1405d358b2deSVlad Serebrennikov   //   expected-note@#cwg95-C-f {{implicitly declared private here}}
1406463e61a0SVlad Serebrennikov } // namespace cwg95
1407d358b2deSVlad Serebrennikov 
1408f46d1463SErick Velez namespace cwg96 { // cwg96: sup P1787
1409d358b2deSVlad Serebrennikov   struct A {
1410d358b2deSVlad Serebrennikov     void f(int);
1411d358b2deSVlad Serebrennikov     template<typename T> int f(T);
1412d358b2deSVlad Serebrennikov     template<typename T> struct S {};
1413d358b2deSVlad Serebrennikov   } a;
1414d358b2deSVlad Serebrennikov   template<template<typename> class X> struct B {};
1415d358b2deSVlad Serebrennikov 
1416d358b2deSVlad Serebrennikov   template<typename T>
1417d358b2deSVlad Serebrennikov   void test() {
1418d358b2deSVlad Serebrennikov     int k1 = a.template f<int>(0);
1419d358b2deSVlad Serebrennikov     // FIXME: This is ill-formed, because 'f' is not a template-id and does not
1420d358b2deSVlad Serebrennikov     // name a class template.
1421d358b2deSVlad Serebrennikov     // FIXME: What about alias templates?
1422d358b2deSVlad Serebrennikov     int k2 = a.template f(1);
1423f46d1463SErick Velez     // expected-error@-1 {{a template argument list is expected after a name prefixed by the template keyword}}
1424d358b2deSVlad Serebrennikov     A::template S<int> s;
1425d358b2deSVlad Serebrennikov     B<A::template S> b;
1426d358b2deSVlad Serebrennikov   }
1427463e61a0SVlad Serebrennikov } // namespace cwg96
1428d358b2deSVlad Serebrennikov 
142914ba3f9dSVlad Serebrennikov namespace cwg97 { // cwg97: 2.7
1430d358b2deSVlad Serebrennikov   struct A {
1431d358b2deSVlad Serebrennikov     static const int a = false;
1432d358b2deSVlad Serebrennikov     static const int b = !a;
1433d358b2deSVlad Serebrennikov   };
1434463e61a0SVlad Serebrennikov } // namespace cwg97
1435d358b2deSVlad Serebrennikov 
143614ba3f9dSVlad Serebrennikov namespace cwg98 { // cwg98: 2.7
1437d358b2deSVlad Serebrennikov   void test(int n) {
1438d358b2deSVlad Serebrennikov     switch (n) {
1439d358b2deSVlad Serebrennikov       try { // #cwg98-try
1440d358b2deSVlad Serebrennikov         case 0:
1441d358b2deSVlad Serebrennikov         // expected-error@-1 {{cannot jump from switch statement to this case label}}
1442d358b2deSVlad Serebrennikov         //   expected-note@#cwg98-try {{jump bypasses initialization of try block}}
1443d358b2deSVlad Serebrennikov         x:
1444d358b2deSVlad Serebrennikov           throw n;
1445d358b2deSVlad Serebrennikov       } catch (...) { // #cwg98-catch
1446d358b2deSVlad Serebrennikov         case 1:
1447d358b2deSVlad Serebrennikov         // expected-error@-1 {{cannot jump from switch statement to this case label}}
1448d358b2deSVlad Serebrennikov         //   expected-note@#cwg98-catch {{jump bypasses initialization of catch block}}
1449d358b2deSVlad Serebrennikov         y:
1450d358b2deSVlad Serebrennikov           throw n;
1451d358b2deSVlad Serebrennikov       }
1452d358b2deSVlad Serebrennikov       case 2:
1453d358b2deSVlad Serebrennikov         goto x;
1454d358b2deSVlad Serebrennikov         // expected-error@-1 {{cannot jump from this goto statement to its label}}
1455d358b2deSVlad Serebrennikov         //   expected-note@#cwg98-try {{jump bypasses initialization of try block}}
1456d358b2deSVlad Serebrennikov       case 3:
1457d358b2deSVlad Serebrennikov         goto y;
1458d358b2deSVlad Serebrennikov         // expected-error@-1 {{cannot jump from this goto statement to its label}}
1459d358b2deSVlad Serebrennikov         //   expected-note@#cwg98-catch {{jump bypasses initialization of catch block}}
1460d358b2deSVlad Serebrennikov     }
1461d358b2deSVlad Serebrennikov   }
1462463e61a0SVlad Serebrennikov } // namespace cwg98
1463d358b2deSVlad Serebrennikov 
1464d358b2deSVlad Serebrennikov namespace cwg99 { // cwg99: sup 214
1465d358b2deSVlad Serebrennikov   template<typename T> void f(T&);
1466d358b2deSVlad Serebrennikov   template<typename T> int &f(const T&);
1467d358b2deSVlad Serebrennikov   const int n = 0;
1468d358b2deSVlad Serebrennikov   int &r = f(n);
1469463e61a0SVlad Serebrennikov } // namespace cwg99
1470