xref: /aosp_15_r20/external/clang/test/CXX/drs/dr0xx.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -Wno-bind-to-temporary-copy
2*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple
3*67e74705SXin Li // RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple
4*67e74705SXin Li // RUN: %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple
5*67e74705SXin Li 
6*67e74705SXin Li namespace dr1 { // dr1: no
7*67e74705SXin Li   namespace X { extern "C" void dr1_f(int a = 1); }
8*67e74705SXin Li   namespace Y { extern "C" void dr1_f(int a = 1); }
9*67e74705SXin Li   using X::dr1_f; using Y::dr1_f;
g()10*67e74705SXin Li   void g() {
11*67e74705SXin Li     dr1_f(0);
12*67e74705SXin Li     // FIXME: This should be rejected, due to the ambiguous default argument.
13*67e74705SXin Li     dr1_f();
14*67e74705SXin Li   }
15*67e74705SXin Li   namespace X {
16*67e74705SXin Li     using Y::dr1_f;
h()17*67e74705SXin Li     void h() {
18*67e74705SXin Li       dr1_f(0);
19*67e74705SXin Li       // FIXME: This should be rejected, due to the ambiguous default argument.
20*67e74705SXin Li       dr1_f();
21*67e74705SXin Li     }
22*67e74705SXin Li   }
23*67e74705SXin Li 
24*67e74705SXin Li   namespace X {
25*67e74705SXin Li     void z(int);
26*67e74705SXin Li   }
z(int=1)27*67e74705SXin Li   void X::z(int = 1) {} // expected-note {{previous}}
28*67e74705SXin Li   namespace X {
29*67e74705SXin Li     void z(int = 1); // expected-error {{redefinition of default argument}}
30*67e74705SXin Li   }
31*67e74705SXin Li 
32*67e74705SXin Li   void i(int = 1);
j()33*67e74705SXin Li   void j() {
34*67e74705SXin Li     void i(int = 1);
35*67e74705SXin Li     using dr1::i;
36*67e74705SXin Li     i(0);
37*67e74705SXin Li     // FIXME: This should be rejected, due to the ambiguous default argument.
38*67e74705SXin Li     i();
39*67e74705SXin Li   }
k()40*67e74705SXin Li   void k() {
41*67e74705SXin Li     using dr1::i;
42*67e74705SXin Li     void i(int = 1);
43*67e74705SXin Li     i(0);
44*67e74705SXin Li     // FIXME: This should be rejected, due to the ambiguous default argument.
45*67e74705SXin Li     i();
46*67e74705SXin Li   }
47*67e74705SXin Li }
48*67e74705SXin Li 
49*67e74705SXin Li namespace dr3 { // dr3: yes
50*67e74705SXin Li   template<typename T> struct A {};
f(T)51*67e74705SXin Li   template<typename T> void f(T) { A<T> a; } // expected-note {{implicit instantiation}}
52*67e74705SXin Li   template void f(int);
53*67e74705SXin Li   template<> struct A<int> {}; // expected-error {{explicit specialization of 'dr3::A<int>' after instantiation}}
54*67e74705SXin Li }
55*67e74705SXin Li 
56*67e74705SXin Li namespace dr4 { // dr4: yes
57*67e74705SXin Li   extern "C" {
dr4_f(int)58*67e74705SXin Li     static void dr4_f(int) {}
dr4_f(float)59*67e74705SXin Li     static void dr4_f(float) {}
dr4_g(int)60*67e74705SXin Li     void dr4_g(int) {} // expected-note {{previous}}
dr4_g(float)61*67e74705SXin Li     void dr4_g(float) {} // expected-error {{conflicting types}}
62*67e74705SXin Li   }
63*67e74705SXin Li }
64*67e74705SXin Li 
65*67e74705SXin Li namespace dr5 { // dr5: yes
66*67e74705SXin Li   struct A {} a;
67*67e74705SXin Li   struct B {
68*67e74705SXin Li     B(const A&);
69*67e74705SXin Li     B(const B&);
70*67e74705SXin Li   };
71*67e74705SXin Li   const volatile B b = a;
72*67e74705SXin Li 
73*67e74705SXin Li   struct C { C(C&); };
74*67e74705SXin Li   struct D : C {};
75*67e74705SXin Li   struct E { operator D&(); } e;
76*67e74705SXin Li   const C c = e;
77*67e74705SXin Li }
78*67e74705SXin Li 
79*67e74705SXin Li namespace dr7 { // dr7: yes
80*67e74705SXin Li   class A { public: ~A(); };
81*67e74705SXin Li   class B : virtual private A {}; // expected-note 2 {{declared private here}}
82*67e74705SXin Li   class C : public B {} c; // expected-error 2 {{inherited virtual base class 'dr7::A' has private destructor}} \
83*67e74705SXin Li                            // expected-note {{implicit default constructor for 'dr7::C' first required here}} \
84*67e74705SXin Li                            // expected-note {{implicit destructor for 'dr7::C' first required here}}
85*67e74705SXin Li   class VeryDerivedC : public B, virtual public A {} vdc;
86*67e74705SXin Li 
87*67e74705SXin Li   class X { ~X(); }; // expected-note {{here}}
~Y()88*67e74705SXin Li   class Y : X { ~Y() {} }; // expected-error {{private destructor}}
89*67e74705SXin Li 
90*67e74705SXin Li   namespace PR16370 { // This regressed the first time DR7 was fixed.
91*67e74705SXin Li     struct S1 { virtual ~S1(); };
92*67e74705SXin Li     struct S2 : S1 {};
93*67e74705SXin Li     struct S3 : S2 {};
94*67e74705SXin Li     struct S4 : virtual S2 {};
95*67e74705SXin Li     struct S5 : S3, S4 {
96*67e74705SXin Li       S5();
97*67e74705SXin Li       ~S5();
98*67e74705SXin Li     };
S5()99*67e74705SXin Li     S5::S5() {}
100*67e74705SXin Li   }
101*67e74705SXin Li }
102*67e74705SXin Li 
103*67e74705SXin Li namespace dr8 { // dr8: dup 45
104*67e74705SXin Li   class A {
105*67e74705SXin Li     struct U;
106*67e74705SXin Li     static const int k = 5;
107*67e74705SXin Li     void f();
108*67e74705SXin Li     template<typename, int, void (A::*)()> struct T;
109*67e74705SXin Li 
110*67e74705SXin Li     T<U, k, &A::f> *g();
111*67e74705SXin Li   };
g()112*67e74705SXin Li   A::T<A::U, A::k, &A::f> *A::g() { return 0; }
113*67e74705SXin Li }
114*67e74705SXin Li 
115*67e74705SXin Li namespace dr9 { // dr9: yes
116*67e74705SXin Li   struct B {
117*67e74705SXin Li   protected:
118*67e74705SXin Li     int m; // expected-note {{here}}
119*67e74705SXin Li     friend int R1();
120*67e74705SXin Li   };
121*67e74705SXin Li   struct N : protected B { // expected-note 2{{protected}}
122*67e74705SXin Li     friend int R2();
123*67e74705SXin Li   } n;
R1()124*67e74705SXin Li   int R1() { return n.m; } // expected-error {{protected base class}} expected-error {{protected member}}
R2()125*67e74705SXin Li   int R2() { return n.m; }
126*67e74705SXin Li }
127*67e74705SXin Li 
128*67e74705SXin Li namespace dr10 { // dr10: dup 45
129*67e74705SXin Li   class A {
130*67e74705SXin Li     struct B {
131*67e74705SXin Li       A::B *p;
132*67e74705SXin Li     };
133*67e74705SXin Li   };
134*67e74705SXin Li }
135*67e74705SXin Li 
136*67e74705SXin Li namespace dr11 { // dr11: yes
137*67e74705SXin Li   template<typename T> struct A : T {
138*67e74705SXin Li     using typename T::U;
139*67e74705SXin Li     U u;
140*67e74705SXin Li   };
141*67e74705SXin Li   template<typename T> struct B : T {
142*67e74705SXin Li     using T::V;
143*67e74705SXin Li     V v; // expected-error {{unknown type name}}
144*67e74705SXin Li   };
145*67e74705SXin Li   struct X { typedef int U; };
146*67e74705SXin Li   A<X> ax;
147*67e74705SXin Li }
148*67e74705SXin Li 
149*67e74705SXin Li namespace dr12 { // dr12: sup 239
150*67e74705SXin Li   enum E { e };
151*67e74705SXin Li   E &f(E, E = e);
g()152*67e74705SXin Li   void g() {
153*67e74705SXin Li     int &f(int, E = e);
154*67e74705SXin Li     // Under DR12, these call two different functions.
155*67e74705SXin Li     // Under DR239, they call the same function.
156*67e74705SXin Li     int &b = f(e);
157*67e74705SXin Li     int &c = f(1);
158*67e74705SXin Li   }
159*67e74705SXin Li }
160*67e74705SXin Li 
161*67e74705SXin Li namespace dr13 { // dr13: no
162*67e74705SXin Li   extern "C" void f(int);
163*67e74705SXin Li   void g(char);
164*67e74705SXin Li 
165*67e74705SXin Li   template<typename T> struct A {
166*67e74705SXin Li     A(void (*fp)(T));
167*67e74705SXin Li   };
168*67e74705SXin Li   template<typename T> int h(void (T));
169*67e74705SXin Li 
170*67e74705SXin Li   A<int> a1(f); // FIXME: We should reject this.
171*67e74705SXin Li   A<char> a2(g);
172*67e74705SXin Li   int a3 = h(f); // FIXME: We should reject this.
173*67e74705SXin Li   int a4 = h(g);
174*67e74705SXin Li }
175*67e74705SXin Li 
176*67e74705SXin Li namespace dr14 { // dr14: yes
177*67e74705SXin Li   namespace X { extern "C" int dr14_f(); }
178*67e74705SXin Li   namespace Y { extern "C" int dr14_f(); }
179*67e74705SXin Li   using namespace X;
180*67e74705SXin Li   using namespace Y;
181*67e74705SXin Li   int k = dr14_f();
182*67e74705SXin Li 
183*67e74705SXin Li   class C {
184*67e74705SXin Li     int k;
185*67e74705SXin Li     friend int Y::dr14_f();
186*67e74705SXin Li   } c;
187*67e74705SXin Li   namespace Z {
dr14_f()188*67e74705SXin Li     extern "C" int dr14_f() { return c.k; }
189*67e74705SXin Li   }
190*67e74705SXin Li 
191*67e74705SXin Li   namespace X { typedef int T; typedef int U; } // expected-note {{candidate}}
192*67e74705SXin Li   namespace Y { typedef int T; typedef long U; } // expected-note {{candidate}}
193*67e74705SXin Li   T t; // ok, same type both times
194*67e74705SXin Li   U u; // expected-error {{ambiguous}}
195*67e74705SXin Li }
196*67e74705SXin Li 
197*67e74705SXin Li namespace dr15 { // dr15: yes
198*67e74705SXin Li   template<typename T> void f(int); // expected-note {{previous}}
199*67e74705SXin Li   template<typename T> void f(int = 0); // expected-error {{default arguments cannot be added}}
200*67e74705SXin Li }
201*67e74705SXin Li 
202*67e74705SXin Li namespace dr16 { // dr16: yes
203*67e74705SXin Li   class A { // expected-note {{here}}
204*67e74705SXin Li     void f(); // expected-note {{here}}
205*67e74705SXin Li     friend class C;
206*67e74705SXin Li   };
207*67e74705SXin Li   class B : A {}; // expected-note 4{{here}}
208*67e74705SXin Li   class C : B {
g()209*67e74705SXin Li     void g() {
210*67e74705SXin Li       f(); // expected-error {{private member}} expected-error {{private base}}
211*67e74705SXin Li       A::f(); // expected-error {{private member}} expected-error {{private base}}
212*67e74705SXin Li     }
213*67e74705SXin Li   };
214*67e74705SXin Li }
215*67e74705SXin Li 
216*67e74705SXin Li namespace dr17 { // dr17: yes
217*67e74705SXin Li   class A {
218*67e74705SXin Li     int n;
219*67e74705SXin Li     int f();
220*67e74705SXin Li     struct C;
221*67e74705SXin Li   };
222*67e74705SXin Li   struct B : A {} b;
f()223*67e74705SXin Li   int A::f() { return b.n; }
224*67e74705SXin Li   struct A::C : A {
gdr17::A::C225*67e74705SXin Li     int g() { return n; }
226*67e74705SXin Li   };
227*67e74705SXin Li }
228*67e74705SXin Li 
229*67e74705SXin Li // dr18: sup 577
230*67e74705SXin Li 
231*67e74705SXin Li namespace dr19 { // dr19: yes
232*67e74705SXin Li   struct A {
233*67e74705SXin Li     int n; // expected-note {{here}}
234*67e74705SXin Li   };
235*67e74705SXin Li   struct B : protected A { // expected-note {{here}}
236*67e74705SXin Li   };
237*67e74705SXin Li   struct C : B {} c;
238*67e74705SXin Li   struct D : B {
get1dr19::D239*67e74705SXin Li     int get1() { return c.n; } // expected-error {{protected member}}
get2dr19::D240*67e74705SXin Li     int get2() { return ((A&)c).n; } // ok, A is an accessible base of B from here
241*67e74705SXin Li   };
242*67e74705SXin Li }
243*67e74705SXin Li 
244*67e74705SXin Li namespace dr20 { // dr20: yes
245*67e74705SXin Li   class X {
246*67e74705SXin Li   public:
247*67e74705SXin Li     X();
248*67e74705SXin Li   private:
249*67e74705SXin Li     X(const X&); // expected-note {{here}}
250*67e74705SXin Li   };
251*67e74705SXin Li   X f();
252*67e74705SXin Li   X x = f(); // expected-error {{private}}
253*67e74705SXin Li }
254*67e74705SXin Li 
255*67e74705SXin Li namespace dr21 { // dr21: yes
256*67e74705SXin Li   template<typename T> struct A;
257*67e74705SXin Li   struct X {
258*67e74705SXin Li     template<typename T = int> friend struct A; // expected-error {{default template argument not permitted on a friend template}}
259*67e74705SXin Li     template<typename T = int> friend struct B; // expected-error {{default template argument not permitted on a friend template}}
260*67e74705SXin Li   };
261*67e74705SXin Li }
262*67e74705SXin Li 
263*67e74705SXin Li namespace dr22 { // dr22: sup 481
264*67e74705SXin Li   template<typename dr22_T = dr22_T> struct X; // expected-error {{unknown type name 'dr22_T'}}
265*67e74705SXin Li   typedef int T;
266*67e74705SXin Li   template<typename T = T> struct Y;
267*67e74705SXin Li }
268*67e74705SXin Li 
269*67e74705SXin Li namespace dr23 { // dr23: yes
270*67e74705SXin Li   template<typename T> void f(T, T); // expected-note {{candidate}}
271*67e74705SXin Li   template<typename T> void f(T, int); // expected-note {{candidate}}
g()272*67e74705SXin Li   void g() { f(0, 0); } // expected-error {{ambiguous}}
273*67e74705SXin Li }
274*67e74705SXin Li 
275*67e74705SXin Li // dr24: na
276*67e74705SXin Li 
277*67e74705SXin Li namespace dr25 { // dr25: yes
278*67e74705SXin Li   struct A {
279*67e74705SXin Li     void f() throw(int);
280*67e74705SXin Li   };
281*67e74705SXin Li   void (A::*f)() throw (int);
282*67e74705SXin Li   void (A::*g)() throw () = f; // expected-error {{is not superset of source}}
283*67e74705SXin Li   void (A::*g2)() throw () = 0;
284*67e74705SXin Li   void (A::*h)() throw (int, char) = f;
285*67e74705SXin Li   void (A::*i)() throw () = &A::f; // expected-error {{is not superset of source}}
286*67e74705SXin Li   void (A::*i2)() throw () = 0;
287*67e74705SXin Li   void (A::*j)() throw (int, char) = &A::f;
x()288*67e74705SXin Li   void x() {
289*67e74705SXin Li     // FIXME: Don't produce the second error here.
290*67e74705SXin Li     g2 = f; // expected-error {{is not superset}} expected-error {{incompatible}}
291*67e74705SXin Li     h = f;
292*67e74705SXin Li     i2 = &A::f; // expected-error {{is not superset}} expected-error {{incompatible}}
293*67e74705SXin Li     j = &A::f;
294*67e74705SXin Li   }
295*67e74705SXin Li }
296*67e74705SXin Li 
297*67e74705SXin Li namespace dr26 { // dr26: yes
298*67e74705SXin Li   struct A { A(A, const A & = A()); }; // expected-error {{must pass its first argument by reference}}
299*67e74705SXin Li   struct B {
300*67e74705SXin Li     B(); // expected-note {{candidate}}
301*67e74705SXin Li     B(const B &, B = B()); // expected-error {{no matching constructor}} expected-note {{candidate}} expected-note {{here}}
302*67e74705SXin Li   };
303*67e74705SXin Li }
304*67e74705SXin Li 
305*67e74705SXin Li namespace dr27 { // dr27: yes
306*67e74705SXin Li   enum E { e } n;
307*67e74705SXin Li   E &m = true ? n : n;
308*67e74705SXin Li }
309*67e74705SXin Li 
310*67e74705SXin Li // dr28: na
311*67e74705SXin Li 
312*67e74705SXin Li namespace dr29 { // dr29: 3.4
313*67e74705SXin Li   void dr29_f0(); // expected-note {{here}}
g0()314*67e74705SXin Li   void g0() { void dr29_f0(); }
g0_cxx()315*67e74705SXin Li   extern "C++" void g0_cxx() { void dr29_f0(); }
g0_c()316*67e74705SXin Li   extern "C" void g0_c() { void dr29_f0(); } // expected-error {{different language linkage}}
317*67e74705SXin Li 
318*67e74705SXin Li   extern "C" void dr29_f1(); // expected-note {{here}}
g1()319*67e74705SXin Li   void g1() { void dr29_f1(); }
g1_c()320*67e74705SXin Li   extern "C" void g1_c() { void dr29_f1(); }
g1_cxx()321*67e74705SXin Li   extern "C++" void g1_cxx() { void dr29_f1(); } // expected-error {{different language linkage}}
322*67e74705SXin Li 
g2()323*67e74705SXin Li   void g2() { void dr29_f2(); } // expected-note {{here}}
324*67e74705SXin Li   extern "C" void dr29_f2(); // expected-error {{different language linkage}}
325*67e74705SXin Li 
g3()326*67e74705SXin Li   extern "C" void g3() { void dr29_f3(); } // expected-note {{here}}
327*67e74705SXin Li   extern "C++" void dr29_f3(); // expected-error {{different language linkage}}
328*67e74705SXin Li 
g4()329*67e74705SXin Li   extern "C++" void g4() { void dr29_f4(); } // expected-note {{here}}
330*67e74705SXin Li   extern "C" void dr29_f4(); // expected-error {{different language linkage}}
331*67e74705SXin Li 
332*67e74705SXin Li   extern "C" void g5();
333*67e74705SXin Li   extern "C++" void dr29_f5();
g5()334*67e74705SXin Li   void g5() {
335*67e74705SXin Li     void dr29_f5(); // ok, g5 is extern "C" but we're not inside the linkage-specification here.
336*67e74705SXin Li   }
337*67e74705SXin Li 
338*67e74705SXin Li   extern "C++" void g6();
339*67e74705SXin Li   extern "C" void dr29_f6();
g6()340*67e74705SXin Li   void g6() {
341*67e74705SXin Li     void dr29_f6(); // ok, g6 is extern "C" but we're not inside the linkage-specification here.
342*67e74705SXin Li   }
343*67e74705SXin Li 
344*67e74705SXin Li   extern "C" void g7();
345*67e74705SXin Li   extern "C++" void dr29_f7(); // expected-note {{here}}
g7()346*67e74705SXin Li   extern "C" void g7() {
347*67e74705SXin Li     void dr29_f7(); // expected-error {{different language linkage}}
348*67e74705SXin Li   }
349*67e74705SXin Li 
350*67e74705SXin Li   extern "C++" void g8();
351*67e74705SXin Li   extern "C" void dr29_f8(); // expected-note {{here}}
g8()352*67e74705SXin Li   extern "C++" void g8() {
353*67e74705SXin Li     void dr29_f8(); // expected-error {{different language linkage}}
354*67e74705SXin Li   }
355*67e74705SXin Li }
356*67e74705SXin Li 
357*67e74705SXin Li namespace dr30 { // dr30: sup 468 c++11
358*67e74705SXin Li   struct A {
359*67e74705SXin Li     template<int> static int f();
360*67e74705SXin Li   } a, *p = &a;
361*67e74705SXin Li   int x = A::template f<0>();
362*67e74705SXin Li   int y = a.template f<0>();
363*67e74705SXin Li   int z = p->template f<0>();
364*67e74705SXin Li #if __cplusplus < 201103L
365*67e74705SXin Li   // FIXME: It's not clear whether DR468 applies to C++98 too.
366*67e74705SXin Li   // expected-error@-5 {{'template' keyword outside of a template}}
367*67e74705SXin Li   // expected-error@-5 {{'template' keyword outside of a template}}
368*67e74705SXin Li   // expected-error@-5 {{'template' keyword outside of a template}}
369*67e74705SXin Li #endif
370*67e74705SXin Li }
371*67e74705SXin Li 
372*67e74705SXin Li namespace dr31 { // dr31: yes
373*67e74705SXin Li   class X {
374*67e74705SXin Li   private:
375*67e74705SXin Li     void operator delete(void*); // expected-note {{here}}
376*67e74705SXin Li   };
377*67e74705SXin Li   // We would call X::operator delete if X() threw (even though it can't,
378*67e74705SXin Li   // and even though we allocated the X using ::operator delete).
379*67e74705SXin Li   X *p = new X; // expected-error {{private}}
380*67e74705SXin Li }
381*67e74705SXin Li 
382*67e74705SXin Li // dr32: na
383*67e74705SXin Li 
384*67e74705SXin Li namespace dr33 { // dr33: yes
385*67e74705SXin Li   namespace X { struct S; void f(void (*)(S)); } // expected-note {{candidate}}
386*67e74705SXin Li   namespace Y { struct T; void f(void (*)(T)); } // expected-note {{candidate}}
387*67e74705SXin Li   void g(X::S);
388*67e74705SXin Li   template<typename Z> Z g(Y::T);
h()389*67e74705SXin Li   void h() { f(&g); } // expected-error {{ambiguous}}
390*67e74705SXin Li }
391*67e74705SXin Li 
392*67e74705SXin Li // dr34: na
393*67e74705SXin Li // dr35: dup 178
394*67e74705SXin Li // dr37: sup 475
395*67e74705SXin Li 
396*67e74705SXin Li namespace dr38 { // dr38: yes
397*67e74705SXin Li   template<typename T> struct X {};
operator +(X<T> a,X<T> b)398*67e74705SXin Li   template<typename T> X<T> operator+(X<T> a, X<T> b) { return a; }
399*67e74705SXin Li   template X<int> operator+<int>(X<int>, X<int>);
400*67e74705SXin Li }
401*67e74705SXin Li 
402*67e74705SXin Li namespace dr39 { // dr39: no
403*67e74705SXin Li   namespace example1 {
404*67e74705SXin Li     struct A { int &f(int); };
405*67e74705SXin Li     struct B : A {
406*67e74705SXin Li       using A::f;
407*67e74705SXin Li       float &f(float);
408*67e74705SXin Li     } b;
409*67e74705SXin Li     int &r = b.f(0);
410*67e74705SXin Li   }
411*67e74705SXin Li 
412*67e74705SXin Li   namespace example2 {
413*67e74705SXin Li     struct A {
414*67e74705SXin Li       int &x(int); // expected-note {{found}}
415*67e74705SXin Li       static int &y(int); // expected-note {{found}}
416*67e74705SXin Li     };
417*67e74705SXin Li     struct V {
418*67e74705SXin Li       int &z(int);
419*67e74705SXin Li     };
420*67e74705SXin Li     struct B : A, virtual V {
421*67e74705SXin Li       using A::x; // expected-note {{found}}
422*67e74705SXin Li       float &x(float);
423*67e74705SXin Li       using A::y; // expected-note {{found}}
424*67e74705SXin Li       static float &y(float);
425*67e74705SXin Li       using V::z;
426*67e74705SXin Li       float &z(float);
427*67e74705SXin Li     };
428*67e74705SXin Li     struct C : A, B, virtual V {} c; // expected-warning {{direct base 'dr39::example2::A' is inaccessible due to ambiguity:\n    struct dr39::example2::C -> struct dr39::example2::A\n    struct dr39::example2::C -> struct dr39::example2::B -> struct dr39::example2::A}}
429*67e74705SXin Li     int &x = c.x(0); // expected-error {{found in multiple base classes}}
430*67e74705SXin Li     // FIXME: This is valid, because we find the same static data member either way.
431*67e74705SXin Li     int &y = c.y(0); // expected-error {{found in multiple base classes}}
432*67e74705SXin Li     int &z = c.z(0);
433*67e74705SXin Li   }
434*67e74705SXin Li 
435*67e74705SXin Li   namespace example3 {
436*67e74705SXin Li     struct A { static int f(); };
437*67e74705SXin Li     struct B : virtual A { using A::f; };
438*67e74705SXin Li     struct C : virtual A { using A::f; };
439*67e74705SXin Li     struct D : B, C {} d;
440*67e74705SXin Li     int k = d.f();
441*67e74705SXin Li   }
442*67e74705SXin Li 
443*67e74705SXin Li   namespace example4 {
444*67e74705SXin Li     struct A { int n; }; // expected-note {{found}}
445*67e74705SXin Li     struct B : A {};
446*67e74705SXin Li     struct C : A {};
fdr39::example4::D447*67e74705SXin Li     struct D : B, C { int f() { return n; } }; // expected-error {{found in multiple base-class}}
448*67e74705SXin Li   }
449*67e74705SXin Li 
450*67e74705SXin Li   namespace PR5916 {
451*67e74705SXin Li     // FIXME: This is valid.
452*67e74705SXin Li     struct A { int n; }; // expected-note +{{found}}
453*67e74705SXin Li     struct B : A {};
454*67e74705SXin Li     struct C : A {};
455*67e74705SXin Li     struct D : B, C {};
456*67e74705SXin Li     int k = sizeof(D::n); // expected-error {{found in multiple base}} expected-error {{unknown type name}}
457*67e74705SXin Li #if __cplusplus >= 201103L
458*67e74705SXin Li     decltype(D::n) n; // expected-error {{found in multiple base}}
459*67e74705SXin Li #endif
460*67e74705SXin Li   }
461*67e74705SXin Li }
462*67e74705SXin Li 
463*67e74705SXin Li // dr40: na
464*67e74705SXin Li 
465*67e74705SXin Li namespace dr41 { // dr41: yes
466*67e74705SXin Li   struct S f(S);
467*67e74705SXin Li }
468*67e74705SXin Li 
469*67e74705SXin Li namespace dr42 { // dr42: yes
470*67e74705SXin Li   struct A { static const int k = 0; };
471*67e74705SXin Li   struct B : A { static const int k = A::k; };
472*67e74705SXin Li }
473*67e74705SXin Li 
474*67e74705SXin Li // dr43: na
475*67e74705SXin Li 
476*67e74705SXin Li namespace dr44 { // dr44: yes
477*67e74705SXin Li   struct A {
478*67e74705SXin Li     template<int> void f();
479*67e74705SXin Li     template<> void f<0>(); // expected-error {{explicit specialization of 'f' in class scope}}
480*67e74705SXin Li   };
481*67e74705SXin Li }
482*67e74705SXin Li 
483*67e74705SXin Li namespace dr45 { // dr45: yes
484*67e74705SXin Li   class A {
485*67e74705SXin Li     class B {};
486*67e74705SXin Li     class C : B {};
487*67e74705SXin Li     C c;
488*67e74705SXin Li   };
489*67e74705SXin Li }
490*67e74705SXin Li 
491*67e74705SXin Li namespace dr46 { // dr46: yes
492*67e74705SXin Li   template<typename> struct A { template<typename> struct B {}; };
493*67e74705SXin Li   template template struct A<int>::B<int>; // expected-error {{expected unqualified-id}}
494*67e74705SXin Li }
495*67e74705SXin Li 
496*67e74705SXin Li namespace dr47 { // dr47: sup 329
497*67e74705SXin Li   template<typename T> struct A {
f()498*67e74705SXin Li     friend void f() { T t; } // expected-error {{redefinition}} expected-note {{previous}}
499*67e74705SXin Li   };
500*67e74705SXin Li   A<int> a;
501*67e74705SXin Li   A<float> b; // expected-note {{instantiation of}}
502*67e74705SXin Li 
503*67e74705SXin Li   void f();
g()504*67e74705SXin Li   void g() { f(); }
505*67e74705SXin Li }
506*67e74705SXin Li 
507*67e74705SXin Li namespace dr48 { // dr48: yes
508*67e74705SXin Li   namespace {
509*67e74705SXin Li     struct S {
510*67e74705SXin Li       static const int m = 0;
511*67e74705SXin Li       static const int n = 0;
512*67e74705SXin Li       static const int o = 0;
513*67e74705SXin Li     };
514*67e74705SXin Li   }
515*67e74705SXin Li   int a = S::m;
516*67e74705SXin Li   // FIXME: We should produce a 'has internal linkage but is not defined'
517*67e74705SXin Li   // diagnostic for 'S::n'.
518*67e74705SXin Li   const int &b = S::n;
519*67e74705SXin Li   const int S::o;
520*67e74705SXin Li   const int &c = S::o;
521*67e74705SXin Li }
522*67e74705SXin Li 
523*67e74705SXin Li namespace dr49 { // dr49: yes
524*67e74705SXin Li   template<int*> struct A {}; // expected-note 0-2{{here}}
525*67e74705SXin Li   int k;
526*67e74705SXin Li #if __has_feature(cxx_constexpr)
527*67e74705SXin Li   constexpr
528*67e74705SXin Li #endif
529*67e74705SXin Li   int *const p = &k; // expected-note 0-2{{here}}
530*67e74705SXin Li   A<&k> a;
531*67e74705SXin Li   A<p> b;
532*67e74705SXin Li #if __cplusplus <= 201402L
533*67e74705SXin Li   // expected-error@-2 {{must have its address taken}}
534*67e74705SXin Li #endif
535*67e74705SXin Li #if __cplusplus < 201103L
536*67e74705SXin Li   // expected-error@-5 {{internal linkage}}
537*67e74705SXin Li #endif
538*67e74705SXin Li   int *q = &k;
539*67e74705SXin Li   A<q> c;
540*67e74705SXin Li #if __cplusplus < 201103L
541*67e74705SXin Li   // expected-error@-2 {{must have its address taken}}
542*67e74705SXin Li #else
543*67e74705SXin Li   // expected-error@-4 {{constant expression}}
544*67e74705SXin Li   // expected-note@-5 {{read of non-constexpr}}
545*67e74705SXin Li   // expected-note@-7 {{declared here}}
546*67e74705SXin Li #endif
547*67e74705SXin Li }
548*67e74705SXin Li 
549*67e74705SXin Li namespace dr50 { // dr50: yes
550*67e74705SXin Li   struct X; // expected-note {{forward}}
551*67e74705SXin Li   extern X *p;
552*67e74705SXin Li   X *q = (X*)p;
553*67e74705SXin Li   X *r = static_cast<X*>(p);
554*67e74705SXin Li   X *s = const_cast<X*>(p);
555*67e74705SXin Li   X *t = reinterpret_cast<X*>(p);
556*67e74705SXin Li   X *u = dynamic_cast<X*>(p); // expected-error {{incomplete}}
557*67e74705SXin Li }
558*67e74705SXin Li 
559*67e74705SXin Li namespace dr51 { // dr51: yes
560*67e74705SXin Li   struct A {};
561*67e74705SXin Li   struct B : A {};
562*67e74705SXin Li   struct S {
563*67e74705SXin Li     operator A&();
564*67e74705SXin Li     operator B&();
565*67e74705SXin Li   } s;
566*67e74705SXin Li   A &a = s;
567*67e74705SXin Li }
568*67e74705SXin Li 
569*67e74705SXin Li namespace dr52 { // dr52: yes
570*67e74705SXin Li   struct A { int n; }; // expected-note {{here}}
571*67e74705SXin Li   struct B : private A {} b; // expected-note 2{{private}}
572*67e74705SXin Li   // FIXME: This first diagnostic is very strangely worded, and seems to be bogus.
573*67e74705SXin Li   int k = b.A::n; // expected-error {{'A' is a private member of 'dr52::A'}}
574*67e74705SXin Li   // expected-error@-1 {{cannot cast 'struct B' to its private base}}
575*67e74705SXin Li }
576*67e74705SXin Li 
577*67e74705SXin Li namespace dr53 { // dr53: yes
578*67e74705SXin Li   int n = 0;
579*67e74705SXin Li   enum E { e } x = static_cast<E>(n);
580*67e74705SXin Li }
581*67e74705SXin Li 
582*67e74705SXin Li namespace dr54 { // dr54: yes
583*67e74705SXin Li   struct A { int a; } a;
584*67e74705SXin Li   struct V { int v; } v;
585*67e74705SXin Li   struct B : private A, virtual V { int b; } b; // expected-note 6{{private here}}
586*67e74705SXin Li 
587*67e74705SXin Li   A &sab = static_cast<A&>(b); // expected-error {{private base}}
588*67e74705SXin Li   A *spab = static_cast<A*>(&b); // expected-error {{private base}}
589*67e74705SXin Li   int A::*smab = static_cast<int A::*>(&B::b); // expected-error {{private base}}
590*67e74705SXin Li   B &sba = static_cast<B&>(a); // expected-error {{private base}}
591*67e74705SXin Li   B *spba = static_cast<B*>(&a); // expected-error {{private base}}
592*67e74705SXin Li   int B::*smba = static_cast<int B::*>(&A::a); // expected-error {{private base}}
593*67e74705SXin Li 
594*67e74705SXin Li   V &svb = static_cast<V&>(b);
595*67e74705SXin Li   V *spvb = static_cast<V*>(&b);
596*67e74705SXin Li   int V::*smvb = static_cast<int V::*>(&B::b); // expected-error {{virtual base}}
597*67e74705SXin Li   B &sbv = static_cast<B&>(v); // expected-error {{virtual base}}
598*67e74705SXin Li   B *spbv = static_cast<B*>(&v); // expected-error {{virtual base}}
599*67e74705SXin Li   int B::*smbv = static_cast<int B::*>(&V::v); // expected-error {{virtual base}}
600*67e74705SXin Li 
601*67e74705SXin Li   A &cab = (A&)(b);
602*67e74705SXin Li   A *cpab = (A*)(&b);
603*67e74705SXin Li   int A::*cmab = (int A::*)(&B::b);
604*67e74705SXin Li   B &cba = (B&)(a);
605*67e74705SXin Li   B *cpba = (B*)(&a);
606*67e74705SXin Li   int B::*cmba = (int B::*)(&A::a);
607*67e74705SXin Li 
608*67e74705SXin Li   V &cvb = (V&)(b);
609*67e74705SXin Li   V *cpvb = (V*)(&b);
610*67e74705SXin Li   int V::*cmvb = (int V::*)(&B::b); // expected-error {{virtual base}}
611*67e74705SXin Li   B &cbv = (B&)(v); // expected-error {{virtual base}}
612*67e74705SXin Li   B *cpbv = (B*)(&v); // expected-error {{virtual base}}
613*67e74705SXin Li   int B::*cmbv = (int B::*)(&V::v); // expected-error {{virtual base}}
614*67e74705SXin Li }
615*67e74705SXin Li 
616*67e74705SXin Li namespace dr55 { // dr55: yes
617*67e74705SXin Li   enum E { e = 5 };
618*67e74705SXin Li   int test[(e + 1 == 6) ? 1 : -1];
619*67e74705SXin Li }
620*67e74705SXin Li 
621*67e74705SXin Li namespace dr56 { // dr56: yes
622*67e74705SXin Li   struct A {
623*67e74705SXin Li     typedef int T; // expected-note {{previous}}
624*67e74705SXin Li     typedef int T; // expected-error {{redefinition}}
625*67e74705SXin Li   };
626*67e74705SXin Li   struct B {
627*67e74705SXin Li     struct X;
628*67e74705SXin Li     typedef X X; // expected-note {{previous}}
629*67e74705SXin Li     typedef X X; // expected-error {{redefinition}}
630*67e74705SXin Li   };
631*67e74705SXin Li }
632*67e74705SXin Li 
633*67e74705SXin Li namespace dr58 { // dr58: yes
634*67e74705SXin Li   // FIXME: Ideally, we should have a CodeGen test for this.
635*67e74705SXin Li #if __cplusplus >= 201103L
636*67e74705SXin Li   enum E1 { E1_0 = 0, E1_1 = 1 };
637*67e74705SXin Li   enum E2 { E2_0 = 0, E2_m1 = -1 };
638*67e74705SXin Li   struct X { E1 e1 : 1; E2 e2 : 1; };
639*67e74705SXin Li   static_assert(X{E1_1, E2_m1}.e1 == 1, "");
640*67e74705SXin Li   static_assert(X{E1_1, E2_m1}.e2 == -1, "");
641*67e74705SXin Li #endif
642*67e74705SXin Li }
643*67e74705SXin Li 
644*67e74705SXin Li namespace dr59 { // dr59: yes
645*67e74705SXin Li   template<typename T> struct convert_to { operator T() const; };
646*67e74705SXin Li   struct A {}; // expected-note 2{{volatile qualifier}}
647*67e74705SXin Li   struct B : A {}; // expected-note 2{{volatile qualifier}}
648*67e74705SXin Li #if __cplusplus >= 201103L // move constructors
649*67e74705SXin Li   // expected-note@-3 2{{volatile qualifier}}
650*67e74705SXin Li   // expected-note@-3 2{{volatile qualifier}}
651*67e74705SXin Li #endif
652*67e74705SXin Li 
653*67e74705SXin Li   A a1 = convert_to<A>();
654*67e74705SXin Li   A a2 = convert_to<A&>();
655*67e74705SXin Li   A a3 = convert_to<const A>();
656*67e74705SXin Li   A a4 = convert_to<const volatile A>(); // expected-error {{no viable}}
657*67e74705SXin Li   A a5 = convert_to<const volatile A&>(); // expected-error {{no viable}}
658*67e74705SXin Li 
659*67e74705SXin Li   B b1 = convert_to<B>();
660*67e74705SXin Li   B b2 = convert_to<B&>();
661*67e74705SXin Li   B b3 = convert_to<const B>();
662*67e74705SXin Li   B b4 = convert_to<const volatile B>(); // expected-error {{no viable}}
663*67e74705SXin Li   B b5 = convert_to<const volatile B&>(); // expected-error {{no viable}}
664*67e74705SXin Li 
665*67e74705SXin Li   int n1 = convert_to<int>();
666*67e74705SXin Li   int n2 = convert_to<int&>();
667*67e74705SXin Li   int n3 = convert_to<const int>();
668*67e74705SXin Li   int n4 = convert_to<const volatile int>();
669*67e74705SXin Li   int n5 = convert_to<const volatile int&>();
670*67e74705SXin Li }
671*67e74705SXin Li 
672*67e74705SXin Li namespace dr60 { // dr60: yes
673*67e74705SXin Li   void f(int &);
674*67e74705SXin Li   int &f(...);
675*67e74705SXin Li   const int k = 0;
676*67e74705SXin Li   int &n = f(k);
677*67e74705SXin Li }
678*67e74705SXin Li 
679*67e74705SXin Li namespace dr61 { // dr61: yes
680*67e74705SXin Li   struct X {
681*67e74705SXin Li     static void f();
682*67e74705SXin Li   } x;
683*67e74705SXin Li   struct Y {
684*67e74705SXin Li     static void f();
685*67e74705SXin Li     static void f(int);
686*67e74705SXin Li   } y;
687*67e74705SXin Li   // This is (presumably) valid, because x.f does not refer to an overloaded
688*67e74705SXin Li   // function name.
689*67e74705SXin Li   void (*p)() = &x.f;
690*67e74705SXin Li   void (*q)() = &y.f; // expected-error {{cannot create a non-constant pointer to member function}}
691*67e74705SXin Li   void (*r)() = y.f; // expected-error {{cannot create a non-constant pointer to member function}}
692*67e74705SXin Li }
693*67e74705SXin Li 
694*67e74705SXin Li namespace dr62 { // dr62: yes
695*67e74705SXin Li   struct A {
696*67e74705SXin Li     struct { int n; } b;
697*67e74705SXin Li   };
698*67e74705SXin Li   template<typename T> struct X {};
get()699*67e74705SXin Li   template<typename T> T get() { return get<T>(); }
take(T)700*67e74705SXin Li   template<typename T> int take(T) { return 0; }
701*67e74705SXin Li 
702*67e74705SXin Li   X<A> x1;
703*67e74705SXin Li   A a = get<A>();
704*67e74705SXin Li 
705*67e74705SXin Li   typedef struct { } *NoNameForLinkagePtr;
706*67e74705SXin Li #if __cplusplus < 201103L
707*67e74705SXin Li   // expected-note@-2 5{{here}}
708*67e74705SXin Li #endif
709*67e74705SXin Li   NoNameForLinkagePtr noNameForLinkagePtr;
710*67e74705SXin Li 
711*67e74705SXin Li   struct Danger {
712*67e74705SXin Li     NoNameForLinkagePtr p;
713*67e74705SXin Li   };
714*67e74705SXin Li 
715*67e74705SXin Li   X<NoNameForLinkagePtr> x2;
716*67e74705SXin Li   X<const NoNameForLinkagePtr> x3;
717*67e74705SXin Li   NoNameForLinkagePtr p1 = get<NoNameForLinkagePtr>();
718*67e74705SXin Li   NoNameForLinkagePtr p2 = get<const NoNameForLinkagePtr>();
719*67e74705SXin Li   int n1 = take(noNameForLinkagePtr);
720*67e74705SXin Li #if __cplusplus < 201103L
721*67e74705SXin Li   // expected-error@-6 {{uses unnamed type}}
722*67e74705SXin Li   // expected-error@-6 {{uses unnamed type}}
723*67e74705SXin Li   // expected-error@-6 {{uses unnamed type}}
724*67e74705SXin Li   // expected-error@-6 {{uses unnamed type}}
725*67e74705SXin Li   // expected-error@-6 {{uses unnamed type}}
726*67e74705SXin Li #endif
727*67e74705SXin Li 
728*67e74705SXin Li   X<Danger> x4;
729*67e74705SXin Li 
f()730*67e74705SXin Li   void f() {
731*67e74705SXin Li     struct NoLinkage {};
732*67e74705SXin Li     X<NoLinkage> a;
733*67e74705SXin Li     X<const NoLinkage> b;
734*67e74705SXin Li     get<NoLinkage>();
735*67e74705SXin Li     get<const NoLinkage>();
736*67e74705SXin Li     X<void (*)(NoLinkage A::*)> c;
737*67e74705SXin Li     X<int NoLinkage::*> d;
738*67e74705SXin Li #if __cplusplus < 201103L
739*67e74705SXin Li   // expected-error@-7 {{uses local type}}
740*67e74705SXin Li   // expected-error@-7 {{uses local type}}
741*67e74705SXin Li   // expected-error@-7 {{uses local type}}
742*67e74705SXin Li   // expected-error@-7 {{uses local type}}
743*67e74705SXin Li   // expected-error@-7 {{uses local type}}
744*67e74705SXin Li   // expected-error@-7 {{uses local type}}
745*67e74705SXin Li #endif
746*67e74705SXin Li   }
747*67e74705SXin Li }
748*67e74705SXin Li 
749*67e74705SXin Li namespace dr63 { // dr63: yes
750*67e74705SXin Li   template<typename T> struct S { typename T::error e; };
751*67e74705SXin Li   extern S<int> *p;
752*67e74705SXin Li   void *q = p;
753*67e74705SXin Li }
754*67e74705SXin Li 
755*67e74705SXin Li namespace dr64 { // dr64: yes
756*67e74705SXin Li   template<class T> void f(T);
757*67e74705SXin Li   template<class T> void f(T*);
758*67e74705SXin Li   template<> void f(int*);
759*67e74705SXin Li   template<> void f<int>(int*);
760*67e74705SXin Li   template<> void f(int);
761*67e74705SXin Li }
762*67e74705SXin Li 
763*67e74705SXin Li // dr65: na
764*67e74705SXin Li 
765*67e74705SXin Li namespace dr66 { // dr66: no
766*67e74705SXin Li   namespace X {
767*67e74705SXin Li     int f(int n); // expected-note 2{{candidate}}
768*67e74705SXin Li   }
769*67e74705SXin Li   using X::f;
770*67e74705SXin Li   namespace X {
771*67e74705SXin Li     int f(int n = 0);
772*67e74705SXin Li     int f(int, int);
773*67e74705SXin Li   }
774*67e74705SXin Li   // FIXME: The first two calls here should be accepted.
775*67e74705SXin Li   int a = f(); // expected-error {{no matching function}}
776*67e74705SXin Li   int b = f(1);
777*67e74705SXin Li   int c = f(1, 2); // expected-error {{no matching function}}
778*67e74705SXin Li }
779*67e74705SXin Li 
780*67e74705SXin Li // dr67: na
781*67e74705SXin Li 
782*67e74705SXin Li namespace dr68 { // dr68: yes
783*67e74705SXin Li   template<typename T> struct X {};
784*67e74705SXin Li   struct ::dr68::X<int> x1;
785*67e74705SXin Li   struct ::dr68::template X<int> x2;
786*67e74705SXin Li #if __cplusplus < 201103L
787*67e74705SXin Li   // expected-error@-2 {{'template' keyword outside of a template}}
788*67e74705SXin Li #endif
789*67e74705SXin Li   struct Y {
790*67e74705SXin Li     friend struct X<int>;
791*67e74705SXin Li     friend struct ::dr68::X<char>;
792*67e74705SXin Li     friend struct ::dr68::template X<double>;
793*67e74705SXin Li #if __cplusplus < 201103L
794*67e74705SXin Li   // expected-error@-2 {{'template' keyword outside of a template}}
795*67e74705SXin Li #endif
796*67e74705SXin Li   };
797*67e74705SXin Li   template<typename>
798*67e74705SXin Li   struct Z {
799*67e74705SXin Li     friend struct ::dr68::template X<double>;
800*67e74705SXin Li     friend typename ::dr68::X<double>;
801*67e74705SXin Li #if __cplusplus < 201103L
802*67e74705SXin Li   // expected-error@-2 {{C++11 extension}}
803*67e74705SXin Li #endif
804*67e74705SXin Li   };
805*67e74705SXin Li }
806*67e74705SXin Li 
807*67e74705SXin Li namespace dr69 { // dr69: yes
f()808*67e74705SXin Li   template<typename T> static void f() {}
809*67e74705SXin Li   // FIXME: Should we warn here?
g()810*67e74705SXin Li   inline void g() { f<int>(); }
811*67e74705SXin Li   // FIXME: This should be rejected, per [temp.explicit]p11.
812*67e74705SXin Li   extern template void f<char>();
813*67e74705SXin Li #if __cplusplus < 201103L
814*67e74705SXin Li   // expected-error@-2 {{C++11 extension}}
815*67e74705SXin Li #endif
816*67e74705SXin Li   template<void(*)()> struct Q {};
817*67e74705SXin Li   Q<&f<int> > q;
818*67e74705SXin Li #if __cplusplus < 201103L
819*67e74705SXin Li   // expected-error@-2 {{internal linkage}} expected-note@-11 {{here}}
820*67e74705SXin Li #endif
821*67e74705SXin Li }
822*67e74705SXin Li 
823*67e74705SXin Li namespace dr70 { // dr70: yes
824*67e74705SXin Li   template<int> struct A {};
825*67e74705SXin Li   template<int I, int J> int f(int (&)[I + J], A<I>, A<J>);
826*67e74705SXin Li   int arr[7];
827*67e74705SXin Li   int k = f(arr, A<3>(), A<4>());
828*67e74705SXin Li }
829*67e74705SXin Li 
830*67e74705SXin Li // dr71: na
831*67e74705SXin Li // dr72: dup 69
832*67e74705SXin Li 
833*67e74705SXin Li #if __cplusplus >= 201103L
834*67e74705SXin Li namespace dr73 { // dr73: no
835*67e74705SXin Li   // The resolution to dr73 is unworkable. Consider:
836*67e74705SXin Li   int a, b;
837*67e74705SXin Li   static_assert(&a + 1 != &b, ""); // expected-error {{not an integral constant expression}}
838*67e74705SXin Li }
839*67e74705SXin Li #endif
840*67e74705SXin Li 
841*67e74705SXin Li namespace dr74 { // dr74: yes
842*67e74705SXin Li   enum E { k = 5 };
843*67e74705SXin Li   int (*p)[k] = new int[k][k];
844*67e74705SXin Li }
845*67e74705SXin Li 
846*67e74705SXin Li namespace dr75 { // dr75: yes
847*67e74705SXin Li   struct S {
848*67e74705SXin Li     static int n = 0; // expected-error {{non-const}}
849*67e74705SXin Li   };
850*67e74705SXin Li }
851*67e74705SXin Li 
852*67e74705SXin Li namespace dr76 { // dr76: yes
853*67e74705SXin Li   const volatile int n = 1;
854*67e74705SXin Li   int arr[n]; // expected-error +{{variable length array}}
855*67e74705SXin Li }
856*67e74705SXin Li 
857*67e74705SXin Li namespace dr77 { // dr77: yes
858*67e74705SXin Li   struct A {
859*67e74705SXin Li     struct B {};
860*67e74705SXin Li     friend struct B;
861*67e74705SXin Li   };
862*67e74705SXin Li }
863*67e74705SXin Li 
864*67e74705SXin Li namespace dr78 { // dr78: sup ????
865*67e74705SXin Li   // Under DR78, this is valid, because 'k' has static storage duration, so is
866*67e74705SXin Li   // zero-initialized.
867*67e74705SXin Li   const int k; // expected-error {{default initialization of an object of const}}
868*67e74705SXin Li }
869*67e74705SXin Li 
870*67e74705SXin Li // dr79: na
871*67e74705SXin Li 
872*67e74705SXin Li namespace dr80 { // dr80: yes
873*67e74705SXin Li   struct A {
874*67e74705SXin Li     int A;
875*67e74705SXin Li   };
876*67e74705SXin Li   struct B {
877*67e74705SXin Li     static int B; // expected-error {{same name as its class}}
878*67e74705SXin Li   };
879*67e74705SXin Li   struct C {
880*67e74705SXin Li     int C; // expected-note {{hidden by}}
881*67e74705SXin Li     // FIXME: These diagnostics aren't very good.
882*67e74705SXin Li     C(); // expected-error {{must use 'struct' tag to refer to}} expected-error {{expected member name}}
883*67e74705SXin Li   };
884*67e74705SXin Li   struct D {
885*67e74705SXin Li     D();
886*67e74705SXin Li     int D; // expected-error {{same name as its class}}
887*67e74705SXin Li   };
888*67e74705SXin Li }
889*67e74705SXin Li 
890*67e74705SXin Li // dr81: na
891*67e74705SXin Li // dr82: dup 48
892*67e74705SXin Li 
893*67e74705SXin Li namespace dr83 { // dr83: yes
894*67e74705SXin Li   int &f(const char*);
895*67e74705SXin Li   char &f(char *);
896*67e74705SXin Li   int &k = f("foo");
897*67e74705SXin Li }
898*67e74705SXin Li 
899*67e74705SXin Li namespace dr84 { // dr84: yes
900*67e74705SXin Li   struct B;
901*67e74705SXin Li   struct A { operator B() const; };
902*67e74705SXin Li   struct C {};
903*67e74705SXin Li   struct B {
904*67e74705SXin Li     B(B&); // expected-note {{candidate}}
905*67e74705SXin Li     B(C);
906*67e74705SXin Li     operator C() const;
907*67e74705SXin Li   };
908*67e74705SXin Li   A a;
909*67e74705SXin Li   // Cannot use B(C) / operator C() pair to construct the B from the B temporary
910*67e74705SXin Li   // here.
911*67e74705SXin Li   B b = a; // expected-error {{no viable}}
912*67e74705SXin Li }
913*67e74705SXin Li 
914*67e74705SXin Li namespace dr85 { // dr85: yes
915*67e74705SXin Li   struct A {
916*67e74705SXin Li     struct B;
917*67e74705SXin Li     struct B {}; // expected-note{{previous declaration is here}}
918*67e74705SXin Li     struct B; // expected-error{{class member cannot be redeclared}}
919*67e74705SXin Li 
920*67e74705SXin Li     union U;
921*67e74705SXin Li     union U {}; // expected-note{{previous declaration is here}}
922*67e74705SXin Li     union U; // expected-error{{class member cannot be redeclared}}
923*67e74705SXin Li 
924*67e74705SXin Li #if __cplusplus >= 201103L
925*67e74705SXin Li     enum E1 : int;
926*67e74705SXin Li     enum E1 : int { e1 }; // expected-note{{previous declaration is here}}
927*67e74705SXin Li     enum E1 : int; // expected-error{{class member cannot be redeclared}}
928*67e74705SXin Li 
929*67e74705SXin Li     enum class E2;
930*67e74705SXin Li     enum class E2 { e2 }; // expected-note{{previous declaration is here}}
931*67e74705SXin Li     enum class E2; // expected-error{{class member cannot be redeclared}}
932*67e74705SXin Li #endif
933*67e74705SXin Li   };
934*67e74705SXin Li 
935*67e74705SXin Li   template <typename T>
936*67e74705SXin Li   struct C {
937*67e74705SXin Li     struct B {}; // expected-note{{previous declaration is here}}
938*67e74705SXin Li     struct B; // expected-error{{class member cannot be redeclared}}
939*67e74705SXin Li   };
940*67e74705SXin Li }
941*67e74705SXin Li 
942*67e74705SXin Li // dr86: dup 446
943*67e74705SXin Li 
944*67e74705SXin Li namespace dr87 { // dr87: no
945*67e74705SXin Li   template<typename T> struct X {};
946*67e74705SXin Li   // FIXME: This is invalid.
947*67e74705SXin Li   X<void() throw()> x;
948*67e74705SXin Li   // ... but this is valid.
949*67e74705SXin Li   X<void(void() throw())> y;
950*67e74705SXin Li }
951*67e74705SXin Li 
952*67e74705SXin Li namespace dr88 { // dr88: yes
953*67e74705SXin Li   template<typename T> struct S {
954*67e74705SXin Li     static const int a = 1; // expected-note {{previous}}
955*67e74705SXin Li     static const int b;
956*67e74705SXin Li   };
957*67e74705SXin Li   template<> const int S<int>::a = 4; // expected-error {{already has an initializer}}
958*67e74705SXin Li   template<> const int S<int>::b = 4;
959*67e74705SXin Li }
960*67e74705SXin Li 
961*67e74705SXin Li // dr89: na
962*67e74705SXin Li 
963*67e74705SXin Li namespace dr90 { // dr90: yes
964*67e74705SXin Li   struct A {
965*67e74705SXin Li     template<typename T> friend void dr90_f(T);
966*67e74705SXin Li   };
967*67e74705SXin Li   struct B : A {
968*67e74705SXin Li     template<typename T> friend void dr90_g(T);
969*67e74705SXin Li     struct C {};
970*67e74705SXin Li     union D {};
971*67e74705SXin Li   };
972*67e74705SXin Li   struct E : B {};
973*67e74705SXin Li   struct F : B::C {};
974*67e74705SXin Li 
test()975*67e74705SXin Li   void test() {
976*67e74705SXin Li     dr90_f(A());
977*67e74705SXin Li     dr90_f(B());
978*67e74705SXin Li     dr90_f(B::C()); // expected-error {{undeclared identifier}}
979*67e74705SXin Li     dr90_f(B::D()); // expected-error {{undeclared identifier}}
980*67e74705SXin Li     dr90_f(E());
981*67e74705SXin Li     dr90_f(F()); // expected-error {{undeclared identifier}}
982*67e74705SXin Li 
983*67e74705SXin Li     dr90_g(A()); // expected-error {{undeclared identifier}}
984*67e74705SXin Li     dr90_g(B());
985*67e74705SXin Li     dr90_g(B::C());
986*67e74705SXin Li     dr90_g(B::D());
987*67e74705SXin Li     dr90_g(E());
988*67e74705SXin Li     dr90_g(F()); // expected-error {{undeclared identifier}}
989*67e74705SXin Li   }
990*67e74705SXin Li }
991*67e74705SXin Li 
992*67e74705SXin Li namespace dr91 { // dr91: yes
993*67e74705SXin Li   union U { friend int f(U); };
994*67e74705SXin Li   int k = f(U());
995*67e74705SXin Li }
996*67e74705SXin Li 
997*67e74705SXin Li namespace dr92 { // FIXME: Issue is still open.
998*67e74705SXin Li   void f() throw(int, float);
999*67e74705SXin Li   void (*p)() throw(int) = &f; // expected-error {{target exception specification is not superset of source}}
1000*67e74705SXin Li   void (*q)() throw(int);
1001*67e74705SXin Li   void (**pp)() throw() = &q; // expected-error {{exception specifications are not allowed}}
1002*67e74705SXin Li 
1003*67e74705SXin Li   void g(void() throw());
h()1004*67e74705SXin Li   void h() {
1005*67e74705SXin Li     g(f); // expected-error {{is not superset}}
1006*67e74705SXin Li     g(q); // expected-error {{is not superset}}
1007*67e74705SXin Li   }
1008*67e74705SXin Li 
1009*67e74705SXin Li   // Prior to C++17, this is OK because the exception specification is not
1010*67e74705SXin Li   // considered in this context. In C++17, we *do* perform an implicit
1011*67e74705SXin Li   // conversion (which performs initialization), but we convert to the type of
1012*67e74705SXin Li   // the template parameter, which does not include the exception specification.
1013*67e74705SXin Li   template<void() throw()> struct X {};
1014*67e74705SXin Li   X<&f> xp; // ok
1015*67e74705SXin Li }
1016*67e74705SXin Li 
1017*67e74705SXin Li // dr93: na
1018*67e74705SXin Li 
1019*67e74705SXin Li namespace dr94 { // dr94: yes
1020*67e74705SXin Li   struct A { static const int n = 5; };
1021*67e74705SXin Li   int arr[A::n];
1022*67e74705SXin Li }
1023*67e74705SXin Li 
1024*67e74705SXin Li namespace dr95 { // dr95: yes
1025*67e74705SXin Li   struct A;
1026*67e74705SXin Li   struct B;
1027*67e74705SXin Li   namespace N {
1028*67e74705SXin Li     class C {
1029*67e74705SXin Li       friend struct A;
1030*67e74705SXin Li       friend struct B;
1031*67e74705SXin Li       static void f(); // expected-note {{here}}
1032*67e74705SXin Li     };
1033*67e74705SXin Li     struct A *p; // dr95::A, not dr95::N::A.
1034*67e74705SXin Li   }
1035*67e74705SXin Li   A *q = N::p; // ok, same type
fdr95::B1036*67e74705SXin Li   struct B { void f() { N::C::f(); } }; // expected-error {{private}}
1037*67e74705SXin Li }
1038*67e74705SXin Li 
1039*67e74705SXin Li namespace dr96 { // dr96: no
1040*67e74705SXin Li   struct A {
1041*67e74705SXin Li     void f(int);
1042*67e74705SXin Li     template<typename T> int f(T);
1043*67e74705SXin Li     template<typename T> struct S {};
1044*67e74705SXin Li   } a;
1045*67e74705SXin Li   template<template<typename> class X> struct B {};
1046*67e74705SXin Li 
1047*67e74705SXin Li   template<typename T>
test()1048*67e74705SXin Li   void test() {
1049*67e74705SXin Li     int k1 = a.template f<int>(0);
1050*67e74705SXin Li     // FIXME: This is ill-formed, because 'f' is not a template-id and does not
1051*67e74705SXin Li     // name a class template.
1052*67e74705SXin Li     // FIXME: What about alias templates?
1053*67e74705SXin Li     int k2 = a.template f(1);
1054*67e74705SXin Li     A::template S<int> s;
1055*67e74705SXin Li     B<A::template S> b;
1056*67e74705SXin Li   }
1057*67e74705SXin Li }
1058*67e74705SXin Li 
1059*67e74705SXin Li namespace dr97 { // dr97: yes
1060*67e74705SXin Li   struct A {
1061*67e74705SXin Li     static const int a = false;
1062*67e74705SXin Li     static const int b = !a;
1063*67e74705SXin Li   };
1064*67e74705SXin Li }
1065*67e74705SXin Li 
1066*67e74705SXin Li namespace dr98 { // dr98: yes
test(int n)1067*67e74705SXin Li   void test(int n) {
1068*67e74705SXin Li     switch (n) {
1069*67e74705SXin Li       try { // expected-note 2{{bypasses}}
1070*67e74705SXin Li         case 0: // expected-error {{cannot jump}}
1071*67e74705SXin Li         x:
1072*67e74705SXin Li           throw n;
1073*67e74705SXin Li       } catch (...) { // expected-note 2{{bypasses}}
1074*67e74705SXin Li         case 1: // expected-error {{cannot jump}}
1075*67e74705SXin Li         y:
1076*67e74705SXin Li           throw n;
1077*67e74705SXin Li       }
1078*67e74705SXin Li       case 2:
1079*67e74705SXin Li         goto x; // expected-error {{cannot jump}}
1080*67e74705SXin Li       case 3:
1081*67e74705SXin Li         goto y; // expected-error {{cannot jump}}
1082*67e74705SXin Li     }
1083*67e74705SXin Li   }
1084*67e74705SXin Li }
1085*67e74705SXin Li 
1086*67e74705SXin Li namespace dr99 { // dr99: sup 214
1087*67e74705SXin Li   template<typename T> void f(T&);
1088*67e74705SXin Li   template<typename T> int &f(const T&);
1089*67e74705SXin Li   const int n = 0;
1090*67e74705SXin Li   int &r = f(n);
1091*67e74705SXin Li }
1092