xref: /aosp_15_r20/external/clang/test/CXX/drs/dr4xx.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
2*67e74705SXin Li // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
3*67e74705SXin Li // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
4*67e74705SXin Li // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
5*67e74705SXin Li 
6*67e74705SXin Li // FIXME: __SIZE_TYPE__ expands to 'long long' on some targets.
7*67e74705SXin Li __extension__ typedef __SIZE_TYPE__ size_t;
8*67e74705SXin Li 
9*67e74705SXin Li namespace std { struct type_info; }
10*67e74705SXin Li 
11*67e74705SXin Li namespace dr400 { // dr400: yes
12*67e74705SXin Li   struct A { int a; struct a {}; }; // expected-note 2{{conflicting}} expected-note {{ambiguous}}
13*67e74705SXin Li   struct B { int a; struct a {}; }; // expected-note 2{{target}} expected-note {{ambiguous}}
14*67e74705SXin Li   struct C : A, B { using A::a; struct a b; };
15*67e74705SXin Li   struct D : A, B { using A::a; using B::a; struct a b; }; // expected-error 2{{conflicts}}
16*67e74705SXin Li   struct E : A, B { struct a b; }; // expected-error {{found in multiple base classes}}
17*67e74705SXin Li }
18*67e74705SXin Li 
19*67e74705SXin Li namespace dr401 { // dr401: yes
20*67e74705SXin Li   template<class T, class U = typename T::type> class A : public T {}; // expected-error {{protected}} expected-error 2{{private}}
21*67e74705SXin Li 
22*67e74705SXin Li   class B {
23*67e74705SXin Li   protected:
24*67e74705SXin Li     typedef int type; // expected-note {{protected}}
25*67e74705SXin Li   };
26*67e74705SXin Li 
27*67e74705SXin Li   class C {
28*67e74705SXin Li     typedef int type; // expected-note {{private}}
29*67e74705SXin Li     friend class A<C>; // expected-note {{default argument}}
30*67e74705SXin Li   };
31*67e74705SXin Li 
32*67e74705SXin Li   class D {
33*67e74705SXin Li     typedef int type; // expected-note {{private}}
34*67e74705SXin Li     friend class A<D, int>;
35*67e74705SXin Li   };
36*67e74705SXin Li 
37*67e74705SXin Li   A<B> *b; // expected-note {{default argument}}
38*67e74705SXin Li   // FIXME: We're missing the "in instantiation of" note for the default
39*67e74705SXin Li   // argument here.
40*67e74705SXin Li   A<D> *d;
41*67e74705SXin Li 
42*67e74705SXin Li   struct E {
43*67e74705SXin Li     template<class T, class U = typename T::type> class A : public T {};
44*67e74705SXin Li   };
45*67e74705SXin Li   class F {
46*67e74705SXin Li     typedef int type;
47*67e74705SXin Li     friend class E;
48*67e74705SXin Li   };
49*67e74705SXin Li   E::A<F> eaf; // ok, default argument is in befriended context
50*67e74705SXin Li 
51*67e74705SXin Li   // FIXME: Why do we get different diagnostics in C++11 onwards here? We seem
52*67e74705SXin Li   // to not treat the default template argument as a SFINAE context in C++98.
f(T)53*67e74705SXin Li   template<class T, class U = typename T::type> void f(T) {}
g(B b)54*67e74705SXin Li   void g(B b) { f(b); }
55*67e74705SXin Li #if __cplusplus < 201103L
56*67e74705SXin Li   // expected-error@-3 0-1{{extension}} expected-error@-3 {{protected}} expected-note@-3 {{instantiation}}
57*67e74705SXin Li   // expected-note@-3 {{substituting}}
58*67e74705SXin Li #else
59*67e74705SXin Li   // expected-error@-5 {{no matching}} expected-note@-6 {{protected}}
60*67e74705SXin Li #endif
61*67e74705SXin Li }
62*67e74705SXin Li 
63*67e74705SXin Li namespace dr403 { // dr403: yes
64*67e74705SXin Li   namespace A {
65*67e74705SXin Li     struct S {};
66*67e74705SXin Li     int f(void*);
67*67e74705SXin Li   }
68*67e74705SXin Li   template<typename T> struct X {};
69*67e74705SXin Li   typedef struct X<A::S>::X XS;
70*67e74705SXin Li   XS *p;
71*67e74705SXin Li   int k = f(p); // ok, finds A::f, even though type XS is a typedef-name
72*67e74705SXin Li                 // referring to an elaborated-type-specifier naming a
73*67e74705SXin Li                 // injected-class-name, which is about as far from a
74*67e74705SXin Li                 // template-id as we can make it.
75*67e74705SXin Li }
76*67e74705SXin Li 
77*67e74705SXin Li // dr404: na
78*67e74705SXin Li // (NB: also sup 594)
79*67e74705SXin Li 
80*67e74705SXin Li namespace dr406 { // dr406: yes
81*67e74705SXin Li   typedef struct {
82*67e74705SXin Li     static int n; // expected-error {{static data member 'n' not allowed in anonymous struct}}
83*67e74705SXin Li   } A;
84*67e74705SXin Li }
85*67e74705SXin Li 
86*67e74705SXin Li namespace dr407 { // dr407: 3.8
87*67e74705SXin Li   struct S;
88*67e74705SXin Li   typedef struct S S;
f()89*67e74705SXin Li   void f() {
90*67e74705SXin Li     struct S *p;
91*67e74705SXin Li     {
92*67e74705SXin Li       typedef struct S S; // expected-note {{here}}
93*67e74705SXin Li       struct S *p; // expected-error {{refers to a typedef}}
94*67e74705SXin Li     }
95*67e74705SXin Li   }
96*67e74705SXin Li   struct S {};
97*67e74705SXin Li 
98*67e74705SXin Li   namespace UsingDir {
99*67e74705SXin Li     namespace A {
100*67e74705SXin Li       struct S {}; // expected-note {{found}}
101*67e74705SXin Li     }
102*67e74705SXin Li     namespace B {
103*67e74705SXin Li       typedef int S; // expected-note {{found}}
104*67e74705SXin Li     }
105*67e74705SXin Li     namespace C {
106*67e74705SXin Li       using namespace A;
107*67e74705SXin Li       using namespace B;
108*67e74705SXin Li       struct S s; // expected-error {{ambiguous}}
109*67e74705SXin Li     }
110*67e74705SXin Li     namespace D {
111*67e74705SXin Li       using A::S;
112*67e74705SXin Li       typedef struct S S;
113*67e74705SXin Li       struct S s;
114*67e74705SXin Li     }
115*67e74705SXin Li     namespace E {
116*67e74705SXin Li       // The standard doesn't say whether this is valid. We interpret
117*67e74705SXin Li       // DR407 as meaning "if lookup finds both a tag and a typedef with the
118*67e74705SXin Li       // same type, then it's OK in an elaborated-type-specifier".
119*67e74705SXin Li       typedef A::S S;
120*67e74705SXin Li       using A::S;
121*67e74705SXin Li       struct S s;
122*67e74705SXin Li     }
123*67e74705SXin Li     namespace F {
124*67e74705SXin Li       typedef A::S S;
125*67e74705SXin Li     }
126*67e74705SXin Li     // The standard doesn't say what to do in these cases either.
127*67e74705SXin Li     namespace G {
128*67e74705SXin Li       using namespace A;
129*67e74705SXin Li       using namespace F;
130*67e74705SXin Li       struct S s;
131*67e74705SXin Li     }
132*67e74705SXin Li     namespace H {
133*67e74705SXin Li       using namespace F;
134*67e74705SXin Li       using namespace A;
135*67e74705SXin Li       struct S s;
136*67e74705SXin Li     }
137*67e74705SXin Li   }
138*67e74705SXin Li }
139*67e74705SXin Li 
140*67e74705SXin Li namespace dr408 { // dr408: 3.4
g()141*67e74705SXin Li   template<int N> void g() { int arr[N != 1 ? 1 : -1]; }
g()142*67e74705SXin Li   template<> void g<2>() { }
143*67e74705SXin Li 
144*67e74705SXin Li   template<typename T> struct S {
145*67e74705SXin Li     static int i[];
146*67e74705SXin Li     void f();
147*67e74705SXin Li   };
148*67e74705SXin Li   template<typename T> int S<T>::i[] = { 1 };
149*67e74705SXin Li 
f()150*67e74705SXin Li   template<typename T> void S<T>::f() {
151*67e74705SXin Li     g<sizeof (i) / sizeof (int)>();
152*67e74705SXin Li   }
153*67e74705SXin Li   template<> int S<int>::i[] = { 1, 2 };
154*67e74705SXin Li   template void S<int>::f(); // uses g<2>(), not g<1>().
155*67e74705SXin Li 
156*67e74705SXin Li 
157*67e74705SXin Li   template<typename T> struct R {
158*67e74705SXin Li     static int arr[];
159*67e74705SXin Li     void f();
160*67e74705SXin Li   };
161*67e74705SXin Li   template<typename T> int R<T>::arr[1];
f()162*67e74705SXin Li   template<typename T> void R<T>::f() {
163*67e74705SXin Li     int arr[sizeof(arr) != sizeof(int) ? 1 : -1];
164*67e74705SXin Li   }
165*67e74705SXin Li   template<> int R<int>::arr[2];
166*67e74705SXin Li   template void R<int>::f();
167*67e74705SXin Li }
168*67e74705SXin Li 
169*67e74705SXin Li namespace dr409 { // dr409: yes
170*67e74705SXin Li   template<typename T> struct A {
171*67e74705SXin Li     typedef int B;
172*67e74705SXin Li     B b1;
173*67e74705SXin Li     A::B b2;
174*67e74705SXin Li     A<T>::B b3;
175*67e74705SXin Li     A<T*>::B b4; // expected-error {{missing 'typename'}}
176*67e74705SXin Li   };
177*67e74705SXin Li }
178*67e74705SXin Li 
179*67e74705SXin Li namespace dr410 { // dr410: no
180*67e74705SXin Li   template<class T> void f(T);
181*67e74705SXin Li   void g(int);
182*67e74705SXin Li   namespace M {
183*67e74705SXin Li     template<class T> void h(T);
184*67e74705SXin Li     template<class T> void i(T);
185*67e74705SXin Li     struct A {
186*67e74705SXin Li       friend void f<>(int);
187*67e74705SXin Li       friend void h<>(int);
188*67e74705SXin Li       friend void g(int);
189*67e74705SXin Li       template<class T> void i(T);
190*67e74705SXin Li       friend void i<>(int);
191*67e74705SXin Li     private:
192*67e74705SXin Li       static void z(); // expected-note {{private}}
193*67e74705SXin Li     };
194*67e74705SXin Li 
h(int)195*67e74705SXin Li     template<> void h(int) { A::z(); }
196*67e74705SXin Li     // FIXME: This should be ill-formed. The member A::i<> is befriended,
197*67e74705SXin Li     // not this function.
i(int)198*67e74705SXin Li     template<> void i(int) { A::z(); }
199*67e74705SXin Li   }
f(int)200*67e74705SXin Li   template<> void f(int) { M::A::z(); }
g(int)201*67e74705SXin Li   void g(int) { M::A::z(); } // expected-error {{private}}
202*67e74705SXin Li }
203*67e74705SXin Li 
204*67e74705SXin Li // dr412 is in its own file.
205*67e74705SXin Li 
206*67e74705SXin Li namespace dr413 { // dr413: yes
207*67e74705SXin Li   struct S {
208*67e74705SXin Li     int a;
209*67e74705SXin Li     int : 17;
210*67e74705SXin Li     int b;
211*67e74705SXin Li   };
212*67e74705SXin Li   S s = { 1, 2, 3 }; // expected-error {{excess elements}}
213*67e74705SXin Li 
214*67e74705SXin Li   struct E {};
215*67e74705SXin Li   struct T { // expected-note {{here}}
216*67e74705SXin Li     int a;
217*67e74705SXin Li     E e;
218*67e74705SXin Li     int b;
219*67e74705SXin Li   };
220*67e74705SXin Li   T t1 = { 1, {}, 2 };
221*67e74705SXin Li   T t2 = { 1, 2 }; // expected-error {{aggregate with no elements requires explicit braces}}
222*67e74705SXin Li }
223*67e74705SXin Li 
224*67e74705SXin Li namespace dr414 { // dr414: dup 305
225*67e74705SXin Li   struct X {};
f()226*67e74705SXin Li   void f() {
227*67e74705SXin Li     X x;
228*67e74705SXin Li     struct X {};
229*67e74705SXin Li     x.~X();
230*67e74705SXin Li   }
231*67e74705SXin Li }
232*67e74705SXin Li 
233*67e74705SXin Li namespace dr415 { // dr415: yes
f(T,...)234*67e74705SXin Li   template<typename T> void f(T, ...) { T::error; }
235*67e74705SXin Li   void f(int, int);
g()236*67e74705SXin Li   void g() { f(0, 0); } // ok
237*67e74705SXin Li }
238*67e74705SXin Li 
239*67e74705SXin Li namespace dr416 { // dr416: yes
240*67e74705SXin Li   extern struct A a;
241*67e74705SXin Li   int &operator+(const A&, const A&);
242*67e74705SXin Li   int &k = a + a;
243*67e74705SXin Li   struct A { float &operator+(A&); };
244*67e74705SXin Li   float &f = a + a;
245*67e74705SXin Li }
246*67e74705SXin Li 
247*67e74705SXin Li namespace dr417 { // dr417: no
248*67e74705SXin Li   struct A;
249*67e74705SXin Li   struct dr417::A {}; // expected-warning {{extra qualification}}
250*67e74705SXin Li   struct B { struct X; };
251*67e74705SXin Li   struct C : B {};
252*67e74705SXin Li   struct C::X {}; // expected-error {{no struct named 'X' in 'dr417::C'}}
253*67e74705SXin Li   struct B::X { struct Y; };
254*67e74705SXin Li   struct C::X::Y {}; // ok!
255*67e74705SXin Li   namespace N {
256*67e74705SXin Li     struct D;
257*67e74705SXin Li     struct E;
258*67e74705SXin Li     struct F;
259*67e74705SXin Li     struct H;
260*67e74705SXin Li   }
261*67e74705SXin Li   // FIXME: This is ill-formed.
262*67e74705SXin Li   using N::D;
263*67e74705SXin Li   struct dr417::D {}; // expected-warning {{extra qualification}}
264*67e74705SXin Li   using namespace N;
265*67e74705SXin Li   struct dr417::E {}; // expected-warning {{extra qualification}} expected-error {{no struct named 'E'}}
266*67e74705SXin Li   struct N::F {};
267*67e74705SXin Li   struct G;
268*67e74705SXin Li   using N::H;
269*67e74705SXin Li   namespace M {
270*67e74705SXin Li     struct dr417::G {}; // expected-error {{namespace 'M' does not enclose}}
271*67e74705SXin Li     struct dr417::H {}; // expected-error {{namespace 'M' does not enclose}}
272*67e74705SXin Li   }
273*67e74705SXin Li }
274*67e74705SXin Li 
275*67e74705SXin Li namespace dr420 { // dr420: yes
276*67e74705SXin Li   template<typename T> struct ptr {
277*67e74705SXin Li     T *operator->() const;
278*67e74705SXin Li     T &operator*() const;
279*67e74705SXin Li   };
test(P p)280*67e74705SXin Li   template<typename T, typename P> void test(P p) {
281*67e74705SXin Li     p->~T();
282*67e74705SXin Li     p->T::~T();
283*67e74705SXin Li     (*p).~T();
284*67e74705SXin Li     (*p).T::~T();
285*67e74705SXin Li   }
286*67e74705SXin Li   struct X {};
287*67e74705SXin Li   template void test<int>(int*);
288*67e74705SXin Li   template void test<int>(ptr<int>);
289*67e74705SXin Li   template void test<X>(X*);
290*67e74705SXin Li   template void test<X>(ptr<X>);
291*67e74705SXin Li 
292*67e74705SXin Li   template<typename T>
test2(T p)293*67e74705SXin Li   void test2(T p) {
294*67e74705SXin Li     p->template Y<int>::~Y<int>();
295*67e74705SXin Li     p->~Y<int>();
296*67e74705SXin Li     // FIXME: This is ill-formed, but this diagnostic is terrible. We should
297*67e74705SXin Li     // reject this in the parser.
298*67e74705SXin Li     p->template ~Y<int>(); // expected-error 2{{no member named '~typename Y<int>'}}
299*67e74705SXin Li   }
300*67e74705SXin Li   template<typename T> struct Y {};
301*67e74705SXin Li   template void test2(Y<int>*); // expected-note {{instantiation}}
302*67e74705SXin Li   template void test2(ptr<Y<int> >); // expected-note {{instantiation}}
303*67e74705SXin Li 
test3(int * p,ptr<int> q)304*67e74705SXin Li   void test3(int *p, ptr<int> q) {
305*67e74705SXin Li     typedef int Int;
306*67e74705SXin Li     p->~Int();
307*67e74705SXin Li     q->~Int();
308*67e74705SXin Li     p->Int::~Int();
309*67e74705SXin Li     q->Int::~Int();
310*67e74705SXin Li   }
311*67e74705SXin Li 
312*67e74705SXin Li #if __cplusplus >= 201103L
313*67e74705SXin Li   template<typename T> using id = T;
314*67e74705SXin Li   struct A { template<typename T> using id = T; };
test4(int * p,ptr<int> q)315*67e74705SXin Li   void test4(int *p, ptr<int> q) {
316*67e74705SXin Li     p->~id<int>();
317*67e74705SXin Li     q->~id<int>();
318*67e74705SXin Li     p->id<int>::~id<int>();
319*67e74705SXin Li     q->id<int>::~id<int>();
320*67e74705SXin Li     p->template id<int>::~id<int>(); // expected-error {{expected unqualified-id}}
321*67e74705SXin Li     q->template id<int>::~id<int>(); // expected-error {{expected unqualified-id}}
322*67e74705SXin Li     p->A::template id<int>::~id<int>();
323*67e74705SXin Li     q->A::template id<int>::~id<int>();
324*67e74705SXin Li   }
325*67e74705SXin Li #endif
326*67e74705SXin Li }
327*67e74705SXin Li 
328*67e74705SXin Li namespace dr421 { // dr421: yes
329*67e74705SXin Li   struct X { X(); int n; int &r; };
330*67e74705SXin Li   int *p = &X().n; // expected-error {{taking the address of a temporary}}
331*67e74705SXin Li   int *q = &X().r;
332*67e74705SXin Li }
333*67e74705SXin Li 
334*67e74705SXin Li namespace dr422 { // dr422: yes
f()335*67e74705SXin Li   template<typename T, typename U> void f() {
336*67e74705SXin Li     typedef T type; // expected-note {{prev}}
337*67e74705SXin Li     typedef U type; // expected-error {{redef}}
338*67e74705SXin Li   }
339*67e74705SXin Li   template void f<int, int>();
340*67e74705SXin Li   template void f<int, char>(); // expected-note {{instantiation}}
341*67e74705SXin Li }
342*67e74705SXin Li 
343*67e74705SXin Li namespace dr423 { // dr423: yes
344*67e74705SXin Li   template<typename T> struct X { operator T&(); };
f(X<int> x)345*67e74705SXin Li   void f(X<int> x) { x += 1; }
346*67e74705SXin Li }
347*67e74705SXin Li 
348*67e74705SXin Li namespace dr424 { // dr424: yes
349*67e74705SXin Li   struct A {
350*67e74705SXin Li     typedef int N; // expected-note {{previous}}
351*67e74705SXin Li     typedef int N; // expected-error {{redefinition}}
352*67e74705SXin Li 
353*67e74705SXin Li     struct X;
354*67e74705SXin Li     typedef X X; // expected-note {{previous}}
355*67e74705SXin Li     struct X {};
356*67e74705SXin Li 
357*67e74705SXin Li     struct X *p;
358*67e74705SXin Li     struct A::X *q;
359*67e74705SXin Li     X *r;
360*67e74705SXin Li 
361*67e74705SXin Li     typedef X X; // expected-error {{redefinition}}
362*67e74705SXin Li   };
363*67e74705SXin Li   struct B {
364*67e74705SXin Li     typedef int N;
365*67e74705SXin Li   };
366*67e74705SXin Li   struct C : B {
367*67e74705SXin Li     typedef int N; // expected-note {{previous}}
368*67e74705SXin Li     typedef int N; // expected-error {{redefinition}}
369*67e74705SXin Li   };
370*67e74705SXin Li }
371*67e74705SXin Li 
372*67e74705SXin Li namespace dr425 { // dr425: yes
373*67e74705SXin Li   struct A { template<typename T> operator T() const; } a;
374*67e74705SXin Li   float f = 1.0f * a; // expected-error {{ambiguous}} expected-note 5+{{built-in candidate}}
375*67e74705SXin Li 
376*67e74705SXin Li   template<typename T> struct is_float;
377*67e74705SXin Li   template<> struct is_float<float> { typedef void type; };
378*67e74705SXin Li 
379*67e74705SXin Li   struct B {
380*67e74705SXin Li     template<typename T, typename U = typename is_float<T>::type> operator T() const; // expected-error 0-1{{extension}}
381*67e74705SXin Li   } b;
382*67e74705SXin Li   float g = 1.0f * b; // ok
383*67e74705SXin Li }
384*67e74705SXin Li 
385*67e74705SXin Li namespace dr427 { // dr427: yes
386*67e74705SXin Li   struct B {};
387*67e74705SXin Li   struct D : public B {
388*67e74705SXin Li     D(B &) = delete; // expected-error 0-1{{extension}} expected-note {{deleted}}
389*67e74705SXin Li   };
390*67e74705SXin Li 
391*67e74705SXin Li   extern D d1;
392*67e74705SXin Li   B &b = d1;
393*67e74705SXin Li   const D &d2 = static_cast<const D&>(b);
394*67e74705SXin Li   const D &d3 = (const D&)b;
395*67e74705SXin Li   const D &d4(b); // expected-error {{deleted}}
396*67e74705SXin Li }
397*67e74705SXin Li 
398*67e74705SXin Li namespace dr428 { // dr428: yes
399*67e74705SXin Li   template<typename T> T make();
400*67e74705SXin Li   extern struct X x; // expected-note 5{{forward declaration}}
f()401*67e74705SXin Li   void f() {
402*67e74705SXin Li     throw void(); // expected-error {{cannot throw}}
403*67e74705SXin Li     throw make<void*>();
404*67e74705SXin Li     throw make<const volatile void*>();
405*67e74705SXin Li     throw x; // expected-error {{cannot throw}}
406*67e74705SXin Li     throw make<X&>(); // expected-error {{cannot throw}}
407*67e74705SXin Li     throw make<X*>(); // expected-error {{cannot throw}}
408*67e74705SXin Li     throw make<const volatile X&>(); // expected-error {{cannot throw}}
409*67e74705SXin Li     throw make<const volatile X*>(); // expected-error {{cannot throw}}
410*67e74705SXin Li   }
411*67e74705SXin Li }
412*67e74705SXin Li 
413*67e74705SXin Li namespace dr429 { // dr429: yes c++11
414*67e74705SXin Li   // FIXME: This rule is obviously intended to apply to C++98 as well.
415*67e74705SXin Li   struct A {
416*67e74705SXin Li     static void *operator new(size_t, size_t);
417*67e74705SXin Li     static void operator delete(void*, size_t);
418*67e74705SXin Li   } *a = new (0) A;
419*67e74705SXin Li #if __cplusplus >= 201103L
420*67e74705SXin Li   // expected-error@-2 {{'new' expression with placement arguments refers to non-placement 'operator delete'}}
421*67e74705SXin Li   // expected-note@-4 {{here}}
422*67e74705SXin Li #endif
423*67e74705SXin Li   struct B {
424*67e74705SXin Li     static void *operator new(size_t, size_t);
425*67e74705SXin Li     static void operator delete(void*);
426*67e74705SXin Li     static void operator delete(void*, size_t);
427*67e74705SXin Li   } *b = new (0) B; // ok, second delete is not a non-placement deallocation function
428*67e74705SXin Li }
429*67e74705SXin Li 
430*67e74705SXin Li namespace dr430 { // dr430: yes c++11
431*67e74705SXin Li   // resolved by n2239
432*67e74705SXin Li   // FIXME: This should apply in C++98 too.
f(int n)433*67e74705SXin Li   void f(int n) {
434*67e74705SXin Li     int a[] = { n++, n++, n++ };
435*67e74705SXin Li #if __cplusplus < 201103L
436*67e74705SXin Li     // expected-warning@-2 {{multiple unsequenced modifications to 'n'}}
437*67e74705SXin Li #endif
438*67e74705SXin Li   }
439*67e74705SXin Li }
440*67e74705SXin Li 
441*67e74705SXin Li namespace dr431 { // dr431: yes
442*67e74705SXin Li   struct A {
443*67e74705SXin Li     template<typename T> T *get();
444*67e74705SXin Li     template<typename T> struct B {
445*67e74705SXin Li       template<typename U> U *get();
446*67e74705SXin Li     };
447*67e74705SXin Li   };
448*67e74705SXin Li 
f(A a)449*67e74705SXin Li   template<typename T> void f(A a) {
450*67e74705SXin Li     a.get<A>()->get<T>();
451*67e74705SXin Li     a.get<T>()
452*67e74705SXin Li         ->get<T>(); // expected-error {{use 'template'}}
453*67e74705SXin Li     a.get<T>()->template get<T>();
454*67e74705SXin Li     a.A::get<T>();
455*67e74705SXin Li     A::B<int> *b = a.get<A::B<int> >();
456*67e74705SXin Li     b->get<int>();
457*67e74705SXin Li     b->A::B<int>::get<int>();
458*67e74705SXin Li     b->A::B<int>::get<T>();
459*67e74705SXin Li     b->A::B<T>::get<int>(); // expected-error {{use 'template'}}
460*67e74705SXin Li     b->A::B<T>::template get<int>();
461*67e74705SXin Li     b->A::B<T>::get<T>(); // expected-error {{use 'template'}}
462*67e74705SXin Li     b->A::B<T>::template get<T>();
463*67e74705SXin Li     A::B<T> *c = a.get<A::B<T> >();
464*67e74705SXin Li     c->get<int>(); // expected-error {{use 'template'}}
465*67e74705SXin Li     c->template get<int>();
466*67e74705SXin Li   }
467*67e74705SXin Li }
468*67e74705SXin Li 
469*67e74705SXin Li namespace dr432 { // dr432: yes
470*67e74705SXin Li   template<typename T> struct A {};
471*67e74705SXin Li   template<typename T> struct B : A<B> {}; // expected-error {{requires template arguments}} expected-note {{declared}}
472*67e74705SXin Li   template<typename T> struct C : A<C<T> > {};
473*67e74705SXin Li #if __cplusplus >= 201103L
474*67e74705SXin Li   template<typename T> struct D : decltype(A<D>()) {}; // expected-error {{requires template arguments}} expected-note {{declared}}
475*67e74705SXin Li #endif
476*67e74705SXin Li }
477*67e74705SXin Li 
478*67e74705SXin Li namespace dr433 { // dr433: yes
479*67e74705SXin Li   template<class T> struct S {
480*67e74705SXin Li     void f(union U*);
481*67e74705SXin Li   };
482*67e74705SXin Li   U *p;
f(union U *)483*67e74705SXin Li   template<class T> void S<T>::f(union U*) {}
484*67e74705SXin Li 
485*67e74705SXin Li   S<int> s;
486*67e74705SXin Li }
487*67e74705SXin Li 
488*67e74705SXin Li namespace dr434 { // dr434: yes
f()489*67e74705SXin Li   void f() {
490*67e74705SXin Li     const int ci = 0;
491*67e74705SXin Li     int *pi = 0;
492*67e74705SXin Li     const int *&rpci = pi; // expected-error {{cannot bind}}
493*67e74705SXin Li     rpci = &ci;
494*67e74705SXin Li     *pi = 1;
495*67e74705SXin Li   }
496*67e74705SXin Li }
497*67e74705SXin Li 
498*67e74705SXin Li // dr435: na
499*67e74705SXin Li 
500*67e74705SXin Li namespace dr436 { // dr436: yes
501*67e74705SXin Li   enum E { f }; // expected-note {{previous}}
502*67e74705SXin Li   void f(); // expected-error {{redefinition}}
503*67e74705SXin Li }
504*67e74705SXin Li 
505*67e74705SXin Li namespace dr437 { // dr437: sup 1308
506*67e74705SXin Li   // This is superseded by 1308, which is in turn superseded by 1330,
507*67e74705SXin Li   // which restores this rule.
508*67e74705SXin Li   template<typename U> struct T : U {};
509*67e74705SXin Li   struct S {
510*67e74705SXin Li     void f() throw(S);
511*67e74705SXin Li     void g() throw(T<S>);
512*67e74705SXin Li     struct U;
513*67e74705SXin Li     void h() throw(U);
514*67e74705SXin Li     struct U {};
515*67e74705SXin Li   };
516*67e74705SXin Li }
517*67e74705SXin Li 
518*67e74705SXin Li // dr438 FIXME write a codegen test
519*67e74705SXin Li // dr439 FIXME write a codegen test
520*67e74705SXin Li // dr441 FIXME write a codegen test
521*67e74705SXin Li // dr442: sup 348
522*67e74705SXin Li // dr443: na
523*67e74705SXin Li 
524*67e74705SXin Li namespace dr444 { // dr444: yes
525*67e74705SXin Li   struct D;
526*67e74705SXin Li   struct B { // expected-note {{candidate is the implicit copy}} expected-note 0-1 {{implicit move}}
527*67e74705SXin Li     D &operator=(D &) = delete; // expected-error 0-1{{extension}} expected-note {{deleted}}
528*67e74705SXin Li   };
529*67e74705SXin Li   struct D : B { // expected-note {{candidate is the implicit}} expected-note 0-1 {{implicit move}}
530*67e74705SXin Li     using B::operator=;
531*67e74705SXin Li   } extern d;
f()532*67e74705SXin Li   void f() {
533*67e74705SXin Li     d = d; // expected-error {{deleted}}
534*67e74705SXin Li   }
535*67e74705SXin Li }
536*67e74705SXin Li 
537*67e74705SXin Li namespace dr445 { // dr445: yes
538*67e74705SXin Li   class A { void f(); }; // expected-note {{private}}
539*67e74705SXin Li   struct B {
540*67e74705SXin Li     friend void A::f(); // expected-error {{private}}
541*67e74705SXin Li   };
542*67e74705SXin Li }
543*67e74705SXin Li 
544*67e74705SXin Li namespace dr446 { // dr446: yes
545*67e74705SXin Li   struct C;
546*67e74705SXin Li   struct A {
547*67e74705SXin Li     A();
548*67e74705SXin Li     A(const A&) = delete; // expected-error 0-1{{extension}} expected-note +{{deleted}}
549*67e74705SXin Li     A(const C&);
550*67e74705SXin Li   };
551*67e74705SXin Li   struct C : A {};
f(A a,bool b,C c)552*67e74705SXin Li   void f(A a, bool b, C c) {
553*67e74705SXin Li     void(b ? a : a);
554*67e74705SXin Li     b ? A() : a; // expected-error {{deleted}}
555*67e74705SXin Li     b ? a : A(); // expected-error {{deleted}}
556*67e74705SXin Li     b ? A() : A(); // expected-error {{deleted}}
557*67e74705SXin Li 
558*67e74705SXin Li     void(b ? a : c);
559*67e74705SXin Li     b ? a : C(); // expected-error {{deleted}}
560*67e74705SXin Li     b ? c : A(); // expected-error {{deleted}}
561*67e74705SXin Li     b ? A() : C(); // expected-error {{deleted}}
562*67e74705SXin Li   }
563*67e74705SXin Li }
564*67e74705SXin Li 
565*67e74705SXin Li namespace dr447 { // dr447: yes
566*67e74705SXin Li   struct A { int n; int a[4]; };
567*67e74705SXin Li   template<int> struct U {
568*67e74705SXin Li     typedef int type;
569*67e74705SXin Li     template<typename V> static void h();
570*67e74705SXin Li   };
571*67e74705SXin Li   template<typename T> U<sizeof(T)> g(T);
f(int n)572*67e74705SXin Li   template<typename T, int N> void f(int n) {
573*67e74705SXin Li     // ok, not type dependent
574*67e74705SXin Li     g(__builtin_offsetof(A, n)).h<int>();
575*67e74705SXin Li     g(__builtin_offsetof(T, n)).h<int>();
576*67e74705SXin Li     // value dependent if first argument is a dependent type
577*67e74705SXin Li     U<__builtin_offsetof(A, n)>::type a;
578*67e74705SXin Li     U<__builtin_offsetof(T, n)>::type b; // expected-error +{{}} expected-warning 0+{{}}
579*67e74705SXin Li     // as an extension, we allow the member-designator to include array indices
580*67e74705SXin Li     g(__builtin_offsetof(A, a[0])).h<int>(); // expected-error {{extension}}
581*67e74705SXin Li     g(__builtin_offsetof(A, a[N])).h<int>(); // expected-error {{extension}}
582*67e74705SXin Li     U<__builtin_offsetof(A, a[0])>::type c; // expected-error {{extension}}
583*67e74705SXin Li     U<__builtin_offsetof(A, a[N])>::type d; // expected-error {{extension}} expected-error +{{}} expected-warning 0+{{}}
584*67e74705SXin Li   }
585*67e74705SXin Li }
586*67e74705SXin Li 
587*67e74705SXin Li namespace dr448 { // dr448: yes
588*67e74705SXin Li   template<typename T = int> void f(int); // expected-error 0-1{{extension}} expected-note {{no known conversion}}
g(T t)589*67e74705SXin Li   template<typename T> void g(T t) {
590*67e74705SXin Li     f<T>(t); // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}}
591*67e74705SXin Li     dr448::f(t); // expected-error {{no matching function}}
592*67e74705SXin Li   }
593*67e74705SXin Li   template<typename T> void f(T); // expected-note {{should be declared prior to the call site}}
594*67e74705SXin Li   namespace HideFromADL { struct X {}; }
595*67e74705SXin Li   template void g(int); // ok
596*67e74705SXin Li   template void g(HideFromADL::X); // expected-note {{instantiation of}}
597*67e74705SXin Li }
598*67e74705SXin Li 
599*67e74705SXin Li // dr449: na
600*67e74705SXin Li 
601*67e74705SXin Li namespace dr450 { // dr450: yes
602*67e74705SXin Li   typedef int A[3];
603*67e74705SXin Li   void f1(const A &);
604*67e74705SXin Li   void f2(A &); // expected-note +{{not viable}}
605*67e74705SXin Li   struct S { A n; };
g()606*67e74705SXin Li   void g() {
607*67e74705SXin Li     f1(S().n);
608*67e74705SXin Li     f2(S().n); // expected-error {{no match}}}
609*67e74705SXin Li   }
610*67e74705SXin Li #if __cplusplus >= 201103L
h()611*67e74705SXin Li   void h() {
612*67e74705SXin Li     f1(A{});
613*67e74705SXin Li     f2(A{}); // expected-error {{no match}}
614*67e74705SXin Li   }
615*67e74705SXin Li #endif
616*67e74705SXin Li }
617*67e74705SXin Li 
618*67e74705SXin Li namespace dr451 { // dr451: yes
619*67e74705SXin Li   const int a = 1 / 0; // expected-warning {{undefined}}
620*67e74705SXin Li   const int b = 1 / 0; // expected-warning {{undefined}}
621*67e74705SXin Li   int arr[b]; // expected-error +{{variable length arr}}
622*67e74705SXin Li }
623*67e74705SXin Li 
624*67e74705SXin Li namespace dr452 { // dr452: yes
625*67e74705SXin Li   struct A {
626*67e74705SXin Li     int a, b, c;
627*67e74705SXin Li     A *p;
628*67e74705SXin Li     int f();
Adr452::A629*67e74705SXin Li     A() : a(f()), b(this->f() + a), c(this->a), p(this) {}
630*67e74705SXin Li   };
631*67e74705SXin Li }
632*67e74705SXin Li 
633*67e74705SXin Li // dr454 FIXME write a codegen test
634*67e74705SXin Li 
635*67e74705SXin Li namespace dr456 { // dr456: yes
636*67e74705SXin Li   // sup 903 c++11
637*67e74705SXin Li   const int null = 0;
638*67e74705SXin Li   void *p = null;
639*67e74705SXin Li #if __cplusplus >= 201103L
640*67e74705SXin Li   // expected-error@-2 {{cannot initialize}}
641*67e74705SXin Li #else
642*67e74705SXin Li   // expected-warning@-4 {{null}}
643*67e74705SXin Li #endif
644*67e74705SXin Li 
645*67e74705SXin Li   const bool f = false;
646*67e74705SXin Li   void *q = f;
647*67e74705SXin Li #if __cplusplus >= 201103L
648*67e74705SXin Li   // expected-error@-2 {{cannot initialize}}
649*67e74705SXin Li #else
650*67e74705SXin Li   // expected-warning@-4 {{null}}
651*67e74705SXin Li #endif
652*67e74705SXin Li }
653*67e74705SXin Li 
654*67e74705SXin Li namespace dr457 { // dr457: yes
655*67e74705SXin Li   const int a = 1;
656*67e74705SXin Li   const volatile int b = 1;
657*67e74705SXin Li   int ax[a];
658*67e74705SXin Li   int bx[b]; // expected-error +{{variable length array}}
659*67e74705SXin Li 
660*67e74705SXin Li   enum E {
661*67e74705SXin Li     ea = a,
662*67e74705SXin Li     eb = b // expected-error {{constant}} expected-note {{read of volatile-qualified}}
663*67e74705SXin Li   };
664*67e74705SXin Li }
665*67e74705SXin Li 
666*67e74705SXin Li namespace dr458 { // dr458: no
667*67e74705SXin Li   struct A {
668*67e74705SXin Li     int T;
669*67e74705SXin Li     int f();
670*67e74705SXin Li     template<typename> int g();
671*67e74705SXin Li   };
672*67e74705SXin Li 
673*67e74705SXin Li   template<typename> struct B : A {
674*67e74705SXin Li     int f();
675*67e74705SXin Li     template<typename> int g();
676*67e74705SXin Li     template<typename> int h();
677*67e74705SXin Li   };
678*67e74705SXin Li 
f()679*67e74705SXin Li   int A::f() {
680*67e74705SXin Li     return T;
681*67e74705SXin Li   }
682*67e74705SXin Li   template<typename T>
g()683*67e74705SXin Li   int A::g() {
684*67e74705SXin Li     return T; // FIXME: this is invalid, it finds the template parameter
685*67e74705SXin Li   }
686*67e74705SXin Li 
687*67e74705SXin Li   template<typename T>
f()688*67e74705SXin Li   int B<T>::f() {
689*67e74705SXin Li     return T;
690*67e74705SXin Li   }
691*67e74705SXin Li   template<typename T> template<typename U>
g()692*67e74705SXin Li   int B<T>::g() {
693*67e74705SXin Li     return T;
694*67e74705SXin Li   }
695*67e74705SXin Li   template<typename U> template<typename T>
h()696*67e74705SXin Li   int B<U>::h() {
697*67e74705SXin Li     return T; // FIXME: this is invalid, it finds the template parameter
698*67e74705SXin Li   }
699*67e74705SXin Li }
700*67e74705SXin Li 
701*67e74705SXin Li namespace dr460 { // dr460: yes
702*67e74705SXin Li   namespace X { namespace Q { int n; } }
703*67e74705SXin Li   namespace Y {
704*67e74705SXin Li     using X; // expected-error {{requires a qualified name}}
705*67e74705SXin Li     using dr460::X; // expected-error {{cannot refer to a namespace}}
706*67e74705SXin Li     using X::Q; // expected-error {{cannot refer to a namespace}}
707*67e74705SXin Li   }
708*67e74705SXin Li }
709*67e74705SXin Li 
710*67e74705SXin Li // dr461: na
711*67e74705SXin Li // dr462 FIXME write a codegen test
712*67e74705SXin Li // dr463: na
713*67e74705SXin Li // dr464: na
714*67e74705SXin Li // dr465: na
715*67e74705SXin Li 
716*67e74705SXin Li namespace dr466 { // dr466: no
717*67e74705SXin Li   typedef int I;
718*67e74705SXin Li   typedef const int CI;
719*67e74705SXin Li   typedef volatile int VI;
f(int * a,CI * b,VI * c)720*67e74705SXin Li   void f(int *a, CI *b, VI *c) {
721*67e74705SXin Li     a->~I();
722*67e74705SXin Li     a->~CI();
723*67e74705SXin Li     a->~VI();
724*67e74705SXin Li     a->I::~I();
725*67e74705SXin Li     a->CI::~CI();
726*67e74705SXin Li     a->VI::~VI();
727*67e74705SXin Li 
728*67e74705SXin Li     a->CI::~VI(); // FIXME: This is invalid; CI and VI are not the same scalar type.
729*67e74705SXin Li 
730*67e74705SXin Li     b->~I();
731*67e74705SXin Li     b->~CI();
732*67e74705SXin Li     b->~VI();
733*67e74705SXin Li     b->I::~I();
734*67e74705SXin Li     b->CI::~CI();
735*67e74705SXin Li     b->VI::~VI();
736*67e74705SXin Li 
737*67e74705SXin Li     c->~I();
738*67e74705SXin Li     c->~CI();
739*67e74705SXin Li     c->~VI();
740*67e74705SXin Li     c->I::~I();
741*67e74705SXin Li     c->CI::~CI();
742*67e74705SXin Li     c->VI::~VI();
743*67e74705SXin Li   }
744*67e74705SXin Li }
745*67e74705SXin Li 
746*67e74705SXin Li namespace dr467 { // dr467: yes
747*67e74705SXin Li   int stuff();
748*67e74705SXin Li 
f()749*67e74705SXin Li   int f() {
750*67e74705SXin Li     static bool done;
751*67e74705SXin Li     if (done)
752*67e74705SXin Li       goto later;
753*67e74705SXin Li     static int k = stuff();
754*67e74705SXin Li     done = true;
755*67e74705SXin Li   later:
756*67e74705SXin Li     return k;
757*67e74705SXin Li   }
g()758*67e74705SXin Li   int g() {
759*67e74705SXin Li     goto later; // expected-error {{cannot jump}}
760*67e74705SXin Li     int k = stuff(); // expected-note {{bypasses variable initialization}}
761*67e74705SXin Li   later:
762*67e74705SXin Li     return k;
763*67e74705SXin Li   }
764*67e74705SXin Li }
765*67e74705SXin Li 
766*67e74705SXin Li namespace dr468 { // dr468: yes c++11
767*67e74705SXin Li   // FIXME: Should we allow this in C++98 too?
768*67e74705SXin Li   template<typename> struct A {
769*67e74705SXin Li     template<typename> struct B {
770*67e74705SXin Li       static int C;
771*67e74705SXin Li     };
772*67e74705SXin Li   };
773*67e74705SXin Li   int k = dr468::template A<int>::template B<char>::C;
774*67e74705SXin Li #if __cplusplus < 201103L
775*67e74705SXin Li   // expected-error@-2 2{{'template' keyword outside of a template}}
776*67e74705SXin Li #endif
777*67e74705SXin Li }
778*67e74705SXin Li 
779*67e74705SXin Li namespace dr469 { // dr469: no
780*67e74705SXin Li   // FIXME: The core issue here didn't really answer the question. We don't
781*67e74705SXin Li   // deduce 'const T' from a function or reference type in a class template...
782*67e74705SXin Li   template<typename T> struct X; // expected-note 2{{here}}
783*67e74705SXin Li   template<typename T> struct X<const T> {};
784*67e74705SXin Li   X<int&> x; // expected-error {{undefined}}
785*67e74705SXin Li   X<int()> y; // expected-error {{undefined}}
786*67e74705SXin Li 
787*67e74705SXin Li   // ... but we do in a function template. GCC and EDG fail deduction of 'f'
788*67e74705SXin Li   // and the second 'h'.
789*67e74705SXin Li   template<typename T> void f(const T *);
790*67e74705SXin Li   template<typename T> void g(T *, const T * = 0);
h(T *)791*67e74705SXin Li   template<typename T> void h(T *) { T::error; }
792*67e74705SXin Li   template<typename T> void h(const T *);
i()793*67e74705SXin Li   void i() {
794*67e74705SXin Li     f(&i);
795*67e74705SXin Li     g(&i);
796*67e74705SXin Li     h(&i);
797*67e74705SXin Li   }
798*67e74705SXin Li }
799*67e74705SXin Li 
800*67e74705SXin Li namespace dr470 { // dr470: yes
801*67e74705SXin Li   template<typename T> struct A {
802*67e74705SXin Li     struct B {};
803*67e74705SXin Li   };
804*67e74705SXin Li   template<typename T> struct C {
805*67e74705SXin Li   };
806*67e74705SXin Li 
807*67e74705SXin Li   template struct A<int>; // expected-note {{previous}}
808*67e74705SXin Li   template struct A<int>::B; // expected-error {{duplicate explicit instantiation}}
809*67e74705SXin Li 
810*67e74705SXin Li   // ok, instantiating C<char> doesn't instantiate base class members.
811*67e74705SXin Li   template struct A<char>;
812*67e74705SXin Li   template struct C<char>;
813*67e74705SXin Li }
814*67e74705SXin Li 
815*67e74705SXin Li namespace dr471 { // dr471: yes
816*67e74705SXin Li   struct A { int n; };
817*67e74705SXin Li   struct B : private virtual A {};
818*67e74705SXin Li   struct C : protected virtual A {};
fdr471::D819*67e74705SXin Li   struct D : B, C { int f() { return n; } };
820*67e74705SXin Li   struct E : private virtual A {
821*67e74705SXin Li     using A::n;
822*67e74705SXin Li   };
fdr471::F823*67e74705SXin Li   struct F : E, B { int f() { return n; } };
824*67e74705SXin Li   struct G : virtual A {
825*67e74705SXin Li   private:
826*67e74705SXin Li     using A::n; // expected-note {{here}}
827*67e74705SXin Li   };
fdr471::H828*67e74705SXin Li   struct H : B, G { int f() { return n; } }; // expected-error {{private}}
829*67e74705SXin Li }
830*67e74705SXin Li 
831*67e74705SXin Li namespace dr474 { // dr474: yes
832*67e74705SXin Li   namespace N {
833*67e74705SXin Li     struct S {
834*67e74705SXin Li       void f();
835*67e74705SXin Li     };
836*67e74705SXin Li   }
f()837*67e74705SXin Li   void N::S::f() {
838*67e74705SXin Li     void g(); // expected-note {{previous}}
839*67e74705SXin Li   }
840*67e74705SXin Li   int g();
841*67e74705SXin Li   namespace N {
842*67e74705SXin Li     int g(); // expected-error {{cannot be overloaded}}
843*67e74705SXin Li   }
844*67e74705SXin Li }
845*67e74705SXin Li 
846*67e74705SXin Li // dr475 FIXME write a codegen test
847*67e74705SXin Li 
848*67e74705SXin Li namespace dr477 { // dr477: 3.5
849*67e74705SXin Li   struct A {
850*67e74705SXin Li     explicit A();
851*67e74705SXin Li     virtual void f();
852*67e74705SXin Li   };
853*67e74705SXin Li   struct B {
854*67e74705SXin Li     friend explicit A::A(); // expected-error {{'explicit' is invalid in friend declarations}}
855*67e74705SXin Li     friend virtual void A::f(); // expected-error {{'virtual' is invalid in friend declarations}}
856*67e74705SXin Li   };
A()857*67e74705SXin Li   explicit A::A() {} // expected-error {{can only be specified inside the class definition}}
f()858*67e74705SXin Li   virtual void A::f() {} // expected-error {{can only be specified inside the class definition}}
859*67e74705SXin Li }
860*67e74705SXin Li 
861*67e74705SXin Li namespace dr478 { // dr478: yes
862*67e74705SXin Li   struct A { virtual void f() = 0; }; // expected-note {{unimplemented}}
863*67e74705SXin Li   void f(A *a);
864*67e74705SXin Li   void f(A a[10]); // expected-error {{array of abstract class type}}
865*67e74705SXin Li }
866*67e74705SXin Li 
867*67e74705SXin Li namespace dr479 { // dr479: yes
868*67e74705SXin Li   struct S {
869*67e74705SXin Li     S();
870*67e74705SXin Li   private:
871*67e74705SXin Li     S(const S&); // expected-note +{{here}}
872*67e74705SXin Li     ~S(); // expected-note +{{here}}
873*67e74705SXin Li   };
f()874*67e74705SXin Li   void f() {
875*67e74705SXin Li     throw S();
876*67e74705SXin Li     // expected-error@-1 {{temporary of type 'dr479::S' has private destructor}}
877*67e74705SXin Li     // expected-error@-2 {{calling a private constructor}}
878*67e74705SXin Li     // expected-error@-3 {{exception object of type 'dr479::S' has private destructor}}
879*67e74705SXin Li #if __cplusplus < 201103L
880*67e74705SXin Li     // expected-error@-5 {{C++98 requires an accessible copy constructor}}
881*67e74705SXin Li #endif
882*67e74705SXin Li   }
g()883*67e74705SXin Li   void g() {
884*67e74705SXin Li     S s; // expected-error {{private destructor}}}
885*67e74705SXin Li     throw s;
886*67e74705SXin Li     // expected-error@-1 {{calling a private constructor}}
887*67e74705SXin Li     // expected-error@-2 {{exception object of type 'dr479::S' has private destructor}}
888*67e74705SXin Li   }
h()889*67e74705SXin Li   void h() {
890*67e74705SXin Li     try {
891*67e74705SXin Li       f();
892*67e74705SXin Li       g();
893*67e74705SXin Li     } catch (S s) {
894*67e74705SXin Li       // expected-error@-1 {{calling a private constructor}}
895*67e74705SXin Li       // expected-error@-2 {{variable of type 'dr479::S' has private destructor}}
896*67e74705SXin Li     }
897*67e74705SXin Li   }
898*67e74705SXin Li }
899*67e74705SXin Li 
900*67e74705SXin Li namespace dr480 { // dr480: yes
901*67e74705SXin Li   struct A { int n; };
902*67e74705SXin Li   struct B : A {};
903*67e74705SXin Li   struct C : virtual B {};
904*67e74705SXin Li   struct D : C {};
905*67e74705SXin Li 
906*67e74705SXin Li   int A::*a = &A::n;
907*67e74705SXin Li   int D::*b = a; // expected-error {{virtual base}}
908*67e74705SXin Li 
909*67e74705SXin Li   extern int D::*c;
910*67e74705SXin Li   int A::*d = static_cast<int A::*>(c); // expected-error {{virtual base}}
911*67e74705SXin Li 
912*67e74705SXin Li   D *e;
913*67e74705SXin Li   A *f = e;
914*67e74705SXin Li   D *g = static_cast<D*>(f); // expected-error {{virtual base}}
915*67e74705SXin Li 
916*67e74705SXin Li   extern D &i;
917*67e74705SXin Li   A &j = i;
918*67e74705SXin Li   D &k = static_cast<D&>(j); // expected-error {{virtual base}}
919*67e74705SXin Li }
920*67e74705SXin Li 
921*67e74705SXin Li namespace dr481 { // dr481: yes
922*67e74705SXin Li   template<class T, T U> class A { T *x; };
923*67e74705SXin Li   T *x; // expected-error {{unknown type}}
924*67e74705SXin Li 
925*67e74705SXin Li   template<class T *U> class B { T *x; };
926*67e74705SXin Li   T *y; // ok
927*67e74705SXin Li 
928*67e74705SXin Li   struct C {
929*67e74705SXin Li     template<class T> void f(class D *p);
930*67e74705SXin Li   };
931*67e74705SXin Li   D *z; // ok
932*67e74705SXin Li 
933*67e74705SXin Li   template<typename A = C, typename C = A> struct E {
fdr481::E934*67e74705SXin Li     void f() {
935*67e74705SXin Li       typedef ::dr481::C c; // expected-note {{previous}}
936*67e74705SXin Li       typedef C c; // expected-error {{different type}}
937*67e74705SXin Li     }
938*67e74705SXin Li   };
939*67e74705SXin Li   template struct E<>; // ok
940*67e74705SXin Li   template struct E<int>; // expected-note {{instantiation of}}
941*67e74705SXin Li 
942*67e74705SXin Li   template<template<typename U_no_typo_correction> class A,
943*67e74705SXin Li            A<int> *B,
944*67e74705SXin Li            U_no_typo_correction *C> // expected-error {{unknown type}}
945*67e74705SXin Li   struct F {
946*67e74705SXin Li     U_no_typo_correction *x; // expected-error {{unknown type}}
947*67e74705SXin Li   };
948*67e74705SXin Li 
949*67e74705SXin Li   template<template<class H *> class> struct G {
950*67e74705SXin Li     H *x;
951*67e74705SXin Li   };
952*67e74705SXin Li   H *q;
953*67e74705SXin Li 
954*67e74705SXin Li   typedef int N;
955*67e74705SXin Li   template<N X, typename N, template<N Y> class T> struct I;
956*67e74705SXin Li   template<char*> struct J;
957*67e74705SXin Li   I<123, char*, J> *j;
958*67e74705SXin Li }
959*67e74705SXin Li 
960*67e74705SXin Li namespace dr482 { // dr482: 3.5
961*67e74705SXin Li   extern int a;
962*67e74705SXin Li   void f();
963*67e74705SXin Li 
964*67e74705SXin Li   int dr482::a = 0; // expected-warning {{extra qualification}}
f()965*67e74705SXin Li   void dr482::f() {} // expected-warning {{extra qualification}}
966*67e74705SXin Li 
967*67e74705SXin Li   inline namespace X { // expected-error 0-1{{C++11 feature}}
968*67e74705SXin Li     extern int b;
969*67e74705SXin Li     void g();
970*67e74705SXin Li     struct S;
971*67e74705SXin Li   }
972*67e74705SXin Li   int dr482::b = 0; // expected-warning {{extra qualification}}
g()973*67e74705SXin Li   void dr482::g() {} // expected-warning {{extra qualification}}
974*67e74705SXin Li   struct dr482::S {}; // expected-warning {{extra qualification}}
975*67e74705SXin Li 
976*67e74705SXin Li   void dr482::f(); // expected-warning {{extra qualification}}
977*67e74705SXin Li   void dr482::g(); // expected-warning {{extra qualification}}
978*67e74705SXin Li 
979*67e74705SXin Li   // FIXME: The following are valid in DR482's wording, but these are bugs in
980*67e74705SXin Li   // the wording which we deliberately don't implement.
981*67e74705SXin Li   namespace N { typedef int type; }
982*67e74705SXin Li   typedef int N::type; // expected-error {{typedef declarator cannot be qualified}}
983*67e74705SXin Li   struct A {
984*67e74705SXin Li     struct B;
985*67e74705SXin Li     struct A::B {}; // expected-error {{extra qualification}}
986*67e74705SXin Li 
987*67e74705SXin Li #if __cplusplus >= 201103L
988*67e74705SXin Li     enum class C;
989*67e74705SXin Li     enum class A::C {}; // expected-error {{extra qualification}}
990*67e74705SXin Li #endif
991*67e74705SXin Li   };
992*67e74705SXin Li }
993*67e74705SXin Li 
994*67e74705SXin Li namespace dr483 { // dr483: yes
995*67e74705SXin Li   namespace climits {
996*67e74705SXin Li     int check1[__SCHAR_MAX__ >= 127 ? 1 : -1];
997*67e74705SXin Li     int check2[__SHRT_MAX__ >= 32767 ? 1 : -1];
998*67e74705SXin Li     int check3[__INT_MAX__ >= 32767 ? 1 : -1];
999*67e74705SXin Li     int check4[__LONG_MAX__ >= 2147483647 ? 1 : -1];
1000*67e74705SXin Li     int check5[__LONG_LONG_MAX__ >= 9223372036854775807 ? 1 : -1];
1001*67e74705SXin Li #if __cplusplus < 201103L
1002*67e74705SXin Li     // expected-error@-2 {{extension}}
1003*67e74705SXin Li #endif
1004*67e74705SXin Li   }
1005*67e74705SXin Li   namespace cstdint {
1006*67e74705SXin Li     int check1[__PTRDIFF_WIDTH__ >= 16 ? 1 : -1];
1007*67e74705SXin Li     int check2[__SIG_ATOMIC_WIDTH__ >= 8 ? 1 : -1];
1008*67e74705SXin Li     int check3[__SIZE_WIDTH__ >= 16 ? 1 : -1];
1009*67e74705SXin Li     int check4[__WCHAR_WIDTH__ >= 8 ? 1 : -1];
1010*67e74705SXin Li     int check5[__WINT_WIDTH__ >= 16 ? 1 : -1];
1011*67e74705SXin Li   }
1012*67e74705SXin Li }
1013*67e74705SXin Li 
1014*67e74705SXin Li namespace dr484 { // dr484: yes
1015*67e74705SXin Li   struct A {
1016*67e74705SXin Li     A();
1017*67e74705SXin Li     void f();
1018*67e74705SXin Li   };
1019*67e74705SXin Li   typedef const A CA;
f()1020*67e74705SXin Li   void CA::f() {
1021*67e74705SXin Li     this->~CA();
1022*67e74705SXin Li     this->CA::~A();
1023*67e74705SXin Li     this->CA::A::~A();
1024*67e74705SXin Li   }
A()1025*67e74705SXin Li   CA::A() {}
1026*67e74705SXin Li 
1027*67e74705SXin Li   struct B : CA {
Bdr484::B1028*67e74705SXin Li     B() : CA() {}
fdr484::B1029*67e74705SXin Li     void f() { return CA::f(); }
1030*67e74705SXin Li   };
1031*67e74705SXin Li 
1032*67e74705SXin Li   struct C;
1033*67e74705SXin Li   typedef C CT; // expected-note {{here}}
1034*67e74705SXin Li   struct CT {}; // expected-error {{conflicts with typedef}}
1035*67e74705SXin Li 
1036*67e74705SXin Li   namespace N {
1037*67e74705SXin Li     struct D;
1038*67e74705SXin Li     typedef D DT; // expected-note {{here}}
1039*67e74705SXin Li   }
1040*67e74705SXin Li   struct N::DT {}; // expected-error {{conflicts with typedef}}
1041*67e74705SXin Li 
1042*67e74705SXin Li   typedef struct {
1043*67e74705SXin Li     S(); // expected-error {{requires a type}}
1044*67e74705SXin Li   } S;
1045*67e74705SXin Li }
1046*67e74705SXin Li 
1047*67e74705SXin Li namespace dr485 { // dr485: yes
1048*67e74705SXin Li   namespace N {
1049*67e74705SXin Li     struct S {};
1050*67e74705SXin Li     int operator+(S, S);
1051*67e74705SXin Li     template<typename T> int f(S);
1052*67e74705SXin Li   }
1053*67e74705SXin Li   template<typename T> int f();
1054*67e74705SXin Li 
1055*67e74705SXin Li   N::S s;
1056*67e74705SXin Li   int a = operator+(s, s);
1057*67e74705SXin Li   int b = f<int>(s);
1058*67e74705SXin Li }
1059*67e74705SXin Li 
1060*67e74705SXin Li namespace dr486 { // dr486: yes
1061*67e74705SXin Li   template<typename T> T f(T *); // expected-note 2{{substitution failure}}
1062*67e74705SXin Li   int &f(...);
1063*67e74705SXin Li 
1064*67e74705SXin Li   void g();
1065*67e74705SXin Li   int n[10];
1066*67e74705SXin Li 
h()1067*67e74705SXin Li   void h() {
1068*67e74705SXin Li     int &a = f(&g);
1069*67e74705SXin Li     int &b = f(&n);
1070*67e74705SXin Li     f<void()>(&g); // expected-error {{no match}}
1071*67e74705SXin Li     f<int[10]>(&n); // expected-error {{no match}}
1072*67e74705SXin Li   }
1073*67e74705SXin Li }
1074*67e74705SXin Li 
1075*67e74705SXin Li namespace dr487 { // dr487: yes
1076*67e74705SXin Li   enum E { e };
1077*67e74705SXin Li   int operator+(int, E);
1078*67e74705SXin Li   int i[4 + e]; // expected-error 2{{variable length array}}
1079*67e74705SXin Li }
1080*67e74705SXin Li 
1081*67e74705SXin Li namespace dr488 { // dr488: yes c++11
1082*67e74705SXin Li   template <typename T> void f(T);
1083*67e74705SXin Li   void f(int);
g()1084*67e74705SXin Li   void g() {
1085*67e74705SXin Li     // FIXME: It seems CWG thought this should be a SFINAE failure prior to
1086*67e74705SXin Li     // allowing local types as template arguments. In C++98, we should either
1087*67e74705SXin Li     // allow local types as template arguments or treat this as a SFINAE
1088*67e74705SXin Li     // failure.
1089*67e74705SXin Li     enum E { e };
1090*67e74705SXin Li     f(e);
1091*67e74705SXin Li #if __cplusplus < 201103L
1092*67e74705SXin Li     // expected-error@-2 {{local type}}
1093*67e74705SXin Li #endif
1094*67e74705SXin Li   }
1095*67e74705SXin Li }
1096*67e74705SXin Li 
1097*67e74705SXin Li // dr489: na
1098*67e74705SXin Li 
1099*67e74705SXin Li namespace dr490 { // dr490: yes
1100*67e74705SXin Li   template<typename T> struct X {};
1101*67e74705SXin Li 
1102*67e74705SXin Li   struct A {
1103*67e74705SXin Li     typedef int T;
1104*67e74705SXin Li     struct K {}; // expected-note {{declared}}
1105*67e74705SXin Li 
1106*67e74705SXin Li     int f(T);
1107*67e74705SXin Li     int g(T);
1108*67e74705SXin Li     int h(X<T>);
1109*67e74705SXin Li     int X<T>::*i(); // expected-note {{previous}}
1110*67e74705SXin Li     int K::*j();
1111*67e74705SXin Li 
1112*67e74705SXin Li     template<typename T> T k();
1113*67e74705SXin Li 
1114*67e74705SXin Li     operator X<T>();
1115*67e74705SXin Li   };
1116*67e74705SXin Li 
1117*67e74705SXin Li   struct B {
1118*67e74705SXin Li     typedef char T;
1119*67e74705SXin Li     typedef int U;
1120*67e74705SXin Li     friend int A::f(T);
1121*67e74705SXin Li     friend int A::g(U);
1122*67e74705SXin Li     friend int A::h(X<T>);
1123*67e74705SXin Li 
1124*67e74705SXin Li     // FIXME: Per this DR, these two are valid! That is another defect
1125*67e74705SXin Li     // (no number yet...) which will eventually supersede this one.
1126*67e74705SXin Li     friend int X<T>::*A::i(); // expected-error {{return type}}
1127*67e74705SXin Li     friend int K::*A::j(); // expected-error {{undeclared identifier 'K'; did you mean 'A::K'?}}
1128*67e74705SXin Li 
1129*67e74705SXin Li     // ok, lookup finds B::T, not A::T, so return type matches
1130*67e74705SXin Li     friend char A::k<T>();
1131*67e74705SXin Li     friend int A::k<U>();
1132*67e74705SXin Li 
1133*67e74705SXin Li     // A conversion-type-id in a conversion-function-id is always looked up in
1134*67e74705SXin Li     // the class of the conversion function first.
1135*67e74705SXin Li     friend A::operator X<T>();
1136*67e74705SXin Li   };
1137*67e74705SXin Li }
1138*67e74705SXin Li 
1139*67e74705SXin Li namespace dr491 { // dr491: dup 413
1140*67e74705SXin Li   struct A {} a, b[3] = { a, {} };
1141*67e74705SXin Li   A c[2] = { a, {}, b[1] }; // expected-error {{excess elements}}
1142*67e74705SXin Li }
1143*67e74705SXin Li 
1144*67e74705SXin Li // dr492 FIXME write a codegen test
1145*67e74705SXin Li 
1146*67e74705SXin Li namespace dr493 { // dr493: dup 976
1147*67e74705SXin Li   struct X {
1148*67e74705SXin Li     template <class T> operator const T &() const;
1149*67e74705SXin Li   };
f()1150*67e74705SXin Li   void f() {
1151*67e74705SXin Li     if (X()) {
1152*67e74705SXin Li     }
1153*67e74705SXin Li   }
1154*67e74705SXin Li }
1155*67e74705SXin Li 
1156*67e74705SXin Li namespace dr494 { // dr494: dup 372
1157*67e74705SXin Li   class A {
1158*67e74705SXin Li     class B {};
1159*67e74705SXin Li     friend class C;
1160*67e74705SXin Li   };
1161*67e74705SXin Li   class C : A::B {
1162*67e74705SXin Li     A::B x;
1163*67e74705SXin Li     class D : A::B {
1164*67e74705SXin Li       A::B y;
1165*67e74705SXin Li     };
1166*67e74705SXin Li   };
1167*67e74705SXin Li }
1168*67e74705SXin Li 
1169*67e74705SXin Li namespace dr495 { // dr495: 3.5
1170*67e74705SXin Li   template<typename T>
1171*67e74705SXin Li   struct S {
operator intdr495::S1172*67e74705SXin Li     operator int() { return T::error; }
1173*67e74705SXin Li     template<typename U> operator U();
1174*67e74705SXin Li   };
1175*67e74705SXin Li   S<int> s;
1176*67e74705SXin Li   long n = s;
1177*67e74705SXin Li 
1178*67e74705SXin Li   template<typename T>
1179*67e74705SXin Li   struct S2 {
1180*67e74705SXin Li     template<typename U> operator U();
operator intdr495::S21181*67e74705SXin Li     operator int() { return T::error; }
1182*67e74705SXin Li   };
1183*67e74705SXin Li   S2<int> s2;
1184*67e74705SXin Li   long n2 = s2;
1185*67e74705SXin Li }
1186*67e74705SXin Li 
1187*67e74705SXin Li namespace dr496 { // dr496: no
1188*67e74705SXin Li   struct A { int n; };
1189*67e74705SXin Li   struct B { volatile int n; };
1190*67e74705SXin Li   int check1[ __is_trivially_copyable(const int) ? 1 : -1];
1191*67e74705SXin Li   int check2[!__is_trivially_copyable(volatile int) ? 1 : -1];
1192*67e74705SXin Li   int check3[ __is_trivially_constructible(A, const A&) ? 1 : -1];
1193*67e74705SXin Li   // FIXME: This is wrong.
1194*67e74705SXin Li   int check4[ __is_trivially_constructible(B, const B&) ? 1 : -1];
1195*67e74705SXin Li   int check5[ __is_trivially_assignable(A, const A&) ? 1 : -1];
1196*67e74705SXin Li   // FIXME: This is wrong.
1197*67e74705SXin Li   int check6[ __is_trivially_assignable(B, const B&) ? 1 : -1];
1198*67e74705SXin Li }
1199*67e74705SXin Li 
1200*67e74705SXin Li namespace dr497 { // dr497: sup 253
before()1201*67e74705SXin Li   void before() {
1202*67e74705SXin Li     struct S {
1203*67e74705SXin Li       mutable int i;
1204*67e74705SXin Li     };
1205*67e74705SXin Li     const S cs;
1206*67e74705SXin Li     int S::*pm = &S::i;
1207*67e74705SXin Li     cs.*pm = 88; // expected-error {{not assignable}}
1208*67e74705SXin Li   }
1209*67e74705SXin Li 
after()1210*67e74705SXin Li   void after() {
1211*67e74705SXin Li     struct S {
1212*67e74705SXin Li       S() : i(0) {}
1213*67e74705SXin Li       mutable int i;
1214*67e74705SXin Li     };
1215*67e74705SXin Li     const S cs;
1216*67e74705SXin Li     int S::*pm = &S::i;
1217*67e74705SXin Li     cs.*pm = 88; // expected-error {{not assignable}}
1218*67e74705SXin Li   }
1219*67e74705SXin Li }
1220*67e74705SXin Li 
1221*67e74705SXin Li namespace dr499 { // dr499: yes
1222*67e74705SXin Li   extern char str[];
f()1223*67e74705SXin Li   void f() { throw str; }
1224*67e74705SXin Li }
1225