• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
2 // RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
3 // RUN: %clang_cc1 -std=c++1y %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
4 
5 namespace dr300 { // dr300: yes
f(R (&)(A))6   template<typename R, typename A> void f(R (&)(A)) {}
7   int g(int);
h()8   void h() { f(g); }
9 }
10 
11 namespace dr301 { // dr301: yes
12   // see also dr38
13   struct S;
14   template<typename T> void operator+(T, T);
15   void operator-(S, S);
16 
f()17   void f() {
18     bool a = (void(*)(S, S))operator+<S> <
19              (void(*)(S, S))operator+<S>;
20     bool b = (void(*)(S, S))operator- <
21              (void(*)(S, S))operator-;
22     bool c = (void(*)(S, S))operator+ <
23              (void(*)(S, S))operator-; // expected-error {{expected '>'}}
24   }
25 
f()26   template<typename T> void f() {
27     typename T::template operator+<int> a; // expected-error {{typename specifier refers to a non-type template}} expected-error +{{}}
28     // FIXME: This shouldn't say (null).
29     class T::template operator+<int> b; // expected-error {{identifier followed by '<' indicates a class template specialization but (null) refers to a function template}}
30     enum T::template operator+<int> c; // expected-error {{expected identifier}} expected-error {{does not declare anything}}
31     enum T::template operator+<int>::E d; // expected-error {{qualified name refers into a specialization of function template 'T::template operator +'}} expected-error {{forward reference}}
32     enum T::template X<int>::E e;
33     T::template operator+<int>::foobar(); // expected-error {{qualified name refers into a specialization of function template 'T::template operator +'}}
34     T::template operator+<int>(0); // ok
35   }
36 
37   template<typename T> class operator&<T*> {}; // expected-error +{{}}
38   template<typename T> class T::operator& {}; // expected-error +{{}}
39   template<typename T> class S::operator&<T*> {}; // expected-error +{{}}
40 }
41 
42 namespace dr302 { // dr302: yes
43   struct A { A(); ~A(); };
44 #if __cplusplus < 201103L
45   struct B { // expected-error {{implicit default constructor for 'dr302::B' must explicitly initialize the const member 'n'}}
46     const int n; // expected-note {{declared here}}
47     A a;
48   } b = B(); // expected-note {{first required here}}
49   // Trivial default constructor C::C() is not called here.
50   struct C {
51     const int n;
52   } c = C();
53 #else
54   struct B {
55     const int n; // expected-note {{deleted because field 'n' of const-qualified type 'const int' would not be initialized}}
56     A a;
57   } b = B(); // expected-error {{call to implicitly-deleted default constructor}}
58   // C::C() is called here, because even though it's trivial, it's deleted.
59   struct C {
60     const int n; // expected-note {{deleted because field 'n' of const-qualified type 'const int' would not be initialized}}
61   } c = C(); // expected-error {{call to implicitly-deleted default constructor}}
62   struct D {
63     const int n = 0;
64   } d = D();
65 #endif
66 }
67 
68 // dr303: na
69 
70 namespace dr304 { // dr304: yes
71   typedef int &a;
72   int n = a(); // expected-error {{requires an initializer}}
73 
74   struct S { int &b; };
75   int m = S().b;
76 #if __cplusplus < 201103L
77   // expected-error@-3 {{requires an initializer}}
78   // expected-note@-3 {{in value-initialization}}
79 #else
80   // expected-error@-5 {{deleted}}
81   // expected-note@-7 {{reference}}
82 #endif
83 }
84 
85 namespace dr305 { // dr305: no
86   struct A {
87     typedef A C;
88   };
f(A * a)89   void f(A *a) {
90     struct A {};
91     a->~A();
92     a->~C();
93   }
94   typedef A B;
g(B * b)95   void g(B *b) {
96     b->~B();
97     b->~C();
98   }
h(B * b)99   void h(B *b) {
100     struct B {}; // expected-note {{declared here}}
101     b->~B(); // expected-error {{does not match}}
102   }
103 
104   template<typename T> struct X {};
i(X<int> * x)105   void i(X<int>* x) {
106     struct X {};
107     x->~X<int>();
108     x->~X();
109     x->~X<char>(); // expected-error {{no member named}}
110   }
111 
112   // FIXME: This appears to be valid (but allowing the nested types might be a
113   // defect).
114   template<typename> struct Nested {
115     template<typename> struct Nested {};
116   };
testNested(Nested<int> n)117   void testNested(Nested<int> n) { n.~Nested<int>(); } // expected-error {{no member named}}
118 #if __cplusplus < 201103L
119   // expected-error@-2 {{ambiguous}}
120   // expected-note@-6 {{here}}
121   // expected-note@-6 {{here}}
122 #endif
123 
124 #if __cplusplus >= 201103L
125   struct Y {
126     template<typename T> using T1 = Y;
127   };
128   template<typename T> using T2 = Y;
j(Y * y)129   void j(Y *y) {
130     y->~T1<int>();
131     y->~T2<int>();
132   }
133   struct Z {
134     template<typename T> using T2 = T;
135   };
k(Z * z)136   void k(Z *z) {
137     // FIXME: This diagnostic is terrible.
138     z->~T1<int>(); // expected-error {{'T1' following the 'template' keyword does not refer to a template}} expected-error +{{}}
139     z->~T2<int>(); // expected-error {{no member named '~int'}}
140     z->~T2<Z>();
141   }
142 
143   // FIXME: This is valid.
144   namespace Q {
145     template<typename A> struct R {};
146   }
147   template<typename A> using R = Q::R<int>;
qr(Q::R<int> x)148   void qr(Q::R<int> x) { x.~R<char>(); } // expected-error {{no member named}}
149 #endif
150 }
151 
152 namespace dr306 { // dr306: no
153   // FIXME: dup 39
154   // FIXME: This should be accepted.
155   struct A { struct B {}; }; // expected-note 2{{member}}
156   struct C { typedef A::B B; }; // expected-note {{member}}
157   struct D : A, A::B, C {};
158   D::B b; // expected-error {{found in multiple base classes of different types}}
159 }
160 
161 // dr307: na
162 
163 namespace dr308 { // dr308: yes
164   // This is mostly an ABI library issue.
165   struct A {};
166   struct B : A {};
167   struct C : A {};
168   struct D : B, C {};
f()169   void f() {
170     try {
171       throw D();
172     } catch (const A&) {
173       // unreachable
174     } catch (const B&) {
175       // get here instead
176     }
177   }
178 }
179 
180 // dr309: dup 485
181 
182 namespace dr311 { // dr311: yes
183   namespace X { namespace Y {} }
184   namespace X::Y {} // expected-error {{must define each namespace separately}}
185   namespace X {
186     namespace X::Y {} // expected-error {{must define each namespace separately}}
187   }
188   // FIXME: The diagnostics here are not very good.
189   namespace ::dr311::X {} // expected-error 2+{{}} // expected-warning {{extra qual}}
190 }
191 
192 // dr312: dup 616
193 
194 namespace dr313 { // dr313: dup 299 c++11
195   struct A { operator int() const; };
196   int *p = new int[A()];
197 #if __cplusplus < 201103L
198   // FIXME: should this be available in c++98 mode? expected-error@-2 {{extension}}
199 #endif
200 }
201 
202 namespace dr314 { // dr314: dup 1710
203   template<typename T> struct A {
204     template<typename U> struct B {};
205   };
206   template<typename T> struct C : public A<T>::template B<T> {
207     C() : A<T>::template B<T>() {}
208   };
209 }
210 
211 // dr315: na
212 // dr316: sup 1004
213 
214 namespace dr317 { // dr317: 3.5
215   void f() {} // expected-note {{previous}}
216   inline void f(); // expected-error {{inline declaration of 'f' follows non-inline definition}}
217 
218   int g();
219   int n = g();
220   inline int g() { return 0; }
221 
222   int h();
223   int m = h();
224   int h() { return 0; } // expected-note {{previous}}
225   inline int h(); // expected-error {{inline declaration of 'h' follows non-inline definition}}
226 }
227 
228 namespace dr318 { // dr318: sup 1310
229   struct A {};
230   struct A::A a;
231 }
232 
233 namespace dr319 { // dr319: no
234   // FIXME: dup dr389
235   // FIXME: We don't have a diagnostic for a name with linkage
236   //        having a type without linkage.
237   typedef struct {
238     int i;
239   } *ps;
240   extern "C" void f(ps);
241   void g(ps); // FIXME: ill-formed, type 'ps' has no linkage
242 
243   static enum { e } a1;
244   enum { e2 } a2; // FIXME: ill-formed, enum type has no linkage
245 
246   enum { n1 = 1u };
247   typedef int (*pa)[n1];
248   pa parr; // ok, type has linkage despite using 'n1'
249 
250   template<typename> struct X {};
251 
252   void f() {
253     struct A { int n; };
254     extern A a; // FIXME: ill-formed
255     X<A> xa;
256 
257     typedef A B;
258     extern B b; // FIXME: ill-formed
259     X<B> xb;
260 
261     const int n = 1;
262     typedef int (*C)[n];
263     extern C c; // ok
264     X<C> xc;
265   }
266 #if __cplusplus < 201103L
267   // expected-error@-12 {{uses local type 'A'}}
268   // expected-error@-9 {{uses local type 'A'}}
269 #endif
270 }
271 
272 namespace dr320 { // dr320: yes
273 #if __cplusplus >= 201103L
274   struct X {
275     constexpr X() {}
276     constexpr X(const X &x) : copies(x.copies + 1) {}
277     unsigned copies = 0;
278   };
279   constexpr X f(X x) { return x; }
280   constexpr unsigned g(X x) { return x.copies; }
281   static_assert(f(X()).copies == g(X()) + 1, "expected one extra copy for return value");
282 #endif
283 }
284 
285 namespace dr321 { // dr321: dup 557
286   namespace N {
287     template<int> struct A {
288       template<int> struct B;
289     };
290     template<> template<> struct A<0>::B<0>;
291     void f(A<0>::B<0>);
292   }
293   template<> template<> struct N::A<0>::B<0> {};
294 
295   template<typename T> void g(T t) { f(t); }
296   template void g(N::A<0>::B<0>);
297 
298   namespace N {
299     template<typename> struct I { friend bool operator==(const I&, const I&); };
300   }
301   N::I<int> i, j;
302   bool x = i == j;
303 }
304 
305 namespace dr322 { // dr322: yes
306   struct A {
307     template<typename T> operator T&();
308   } a;
309   int &r = static_cast<int&>(a);
310   int &s = a;
311 }
312 
313 // dr323: no
314 
315 namespace dr324 { // dr324: yes
316   struct S { int n : 1; } s; // expected-note 3{{bit-field is declared here}}
317   int &a = s.n; // expected-error {{non-const reference cannot bind to bit-field}}
318   int *b = &s.n; // expected-error {{address of bit-field}}
319   int &c = (s.n = 0); // expected-error {{non-const reference cannot bind to bit-field}}
320   int *d = &(s.n = 0); // expected-error {{address of bit-field}}
321   int &e = true ? s.n : s.n; // expected-error {{non-const reference cannot bind to bit-field}}
322   int *f = &(true ? s.n : s.n); // expected-error {{address of bit-field}}
323   int &g = (void(), s.n); // expected-error {{non-const reference cannot bind to bit-field}}
324   int *h = &(void(), s.n); // expected-error {{address of bit-field}}
325 }
326 
327 namespace dr326 { // dr326: yes
328   struct S {};
329   int test[__is_trivially_constructible(S, const S&) ? 1 : -1];
330 }
331 
332 namespace dr327 { // dr327: dup 538
333   struct A;
334   class A {};
335 
336   class B;
337   struct B {};
338 }
339 
340 namespace dr328 { // dr328: yes
341   struct A; // expected-note 3{{forward declaration}}
342   struct B { A a; }; // expected-error {{incomplete}}
343   template<typename> struct C { A a; }; // expected-error {{incomplete}}
344   A *p = new A[0]; // expected-error {{incomplete}}
345 }
346 
347 namespace dr329 { // dr329: 3.5
348   struct B {};
349   template<typename T> struct A : B {
350     friend void f(A a) { g(a); }
351     friend void h(A a) { g(a); } // expected-error {{undeclared}}
352     friend void i(B b) {} // expected-error {{redefinition}} expected-note {{previous}}
353   };
354   A<int> a;
355   A<char> b; // expected-note {{instantiation}}
356 
357   void test() {
358     h(a); // expected-note {{instantiation}}
359   }
360 }
361 
362 namespace dr331 { // dr331: yes
363   struct A {
364     A(volatile A&); // expected-note {{candidate}}
365   } const a, b(a); // expected-error {{no matching constructor}}
366 }
367 
368 namespace dr332 { // dr332: dup 557
369   void f(volatile void); // expected-error {{'void' as parameter must not have type qualifiers}}
370   void g(const void); // expected-error {{'void' as parameter must not have type qualifiers}}
371   void h(int n, volatile void); // expected-error {{'void' must be the first and only parameter}}
372 }
373 
374 namespace dr333 { // dr333: yes
375   int n = 0;
376   int f(int(n));
377   int g((int(n)));
378   int h = f(g);
379 }
380 
381 namespace dr334 { // dr334: yes
382   template<typename T> void f() {
383     T x;
384     f((x, 123));
385   }
386   struct S {
387     friend S operator,(S, int);
388     friend void f(S);
389   };
390   template void f<S>();
391 }
392 
393 // dr335: no
394 
395 namespace dr336 { // dr336: yes
396   namespace Pre {
397     template<class T1> class A {
398       template<class T2> class B {
399         template<class T3> void mf1(T3);
400         void mf2();
401       };
402     };
403     template<> template<class X> class A<int>::B {};
404     template<> template<> template<class T> void A<int>::B<double>::mf1(T t) {} // expected-error {{does not match}}
405     template<class Y> template<> void A<Y>::B<double>::mf2() {} // expected-error {{does not refer into a class}}
406   }
407   namespace Post {
408     template<class T1> class A {
409       template<class T2> class B {
410         template<class T3> void mf1(T3);
411         void mf2();
412       };
413     };
414     template<> template<class X> class A<int>::B {
415       template<class T> void mf1(T);
416     };
417     template<> template<> template<class T> void A<int>::B<double>::mf1(T t) {}
418     // FIXME: This diagnostic isn't very good.
419     template<class Y> template<> void A<Y>::B<double>::mf2() {} // expected-error {{does not refer into a class}}
420   }
421 }
422 
423 namespace dr337 { // dr337: yes
424   template<typename T> void f(T (*)[1]);
425   template<typename T> int &f(...);
426 
427   struct A { virtual ~A() = 0; };
428   int &r = f<A>(0);
429 
430   // FIXME: The language rules here are completely broken. We cannot determine
431   // whether an incomplete type is abstract. See DR1640, which will probably
432   // supersede this one and remove this rule.
433   struct B;
434   int &s = f<B>(0); // expected-error {{of type 'void'}}
435   struct B { virtual ~B() = 0; };
436 }
437 
438 namespace dr339 { // dr339: yes
439   template <int I> struct A { static const int value = I; };
440 
441   char xxx(int);
442   char (&xxx(float))[2];
443 
444   template<class T> A<sizeof(xxx((T)0))> f(T) {} // expected-note {{candidate}}
445 
446   void test() {
447     A<1> a = f(0);
448     A<2> b = f(0.0f);
449     A<3> c = f("foo"); // expected-error {{no matching function}}
450   }
451 
452 
453   char f(int);
454   int f(...);
455 
456   template <class T> struct conv_int {
457     static const bool value = sizeof(f(T())) == 1;
458   };
459 
460   template <class T> bool conv_int2(A<sizeof(f(T()))> p);
461 
462   template<typename T> A<sizeof(f(T()))> make_A();
463 
464   int a[conv_int<char>::value ? 1 : -1];
465   bool b = conv_int2<char>(A<1>());
466   A<1> c = make_A<char>();
467 }
468 
469 namespace dr340 { // dr340: yes
470   struct A { A(int); };
471   struct B { B(A, A, int); };
472   int x, y;
473   B b(A(x), A(y), 3);
474 }
475 
476 namespace dr341 { // dr341: sup 1708
477   namespace A {
478     int n;
479     extern "C" int &dr341_a = n; // expected-note {{previous}} expected-note {{declared with C language linkage here}}
480   }
481   namespace B {
482     extern "C" int &dr341_a = dr341_a; // expected-error {{redefinition}}
483   }
484   extern "C" void dr341_b(); // expected-note {{declared with C language linkage here}}
485 }
486 int dr341_a; // expected-error {{declaration of 'dr341_a' in global scope conflicts with declaration with C language linkage}}
487 int dr341_b; // expected-error {{declaration of 'dr341_b' in global scope conflicts with declaration with C language linkage}}
488 int dr341_c; // expected-note {{declared in global scope here}}
489 int dr341_d; // expected-note {{declared in global scope here}}
490 namespace dr341 {
491   extern "C" int dr341_c; // expected-error {{declaration of 'dr341_c' with C language linkage conflicts with declaration in global scope}}
492   extern "C" void dr341_d(); // expected-error {{declaration of 'dr341_d' with C language linkage conflicts with declaration in global scope}}
493 
494   namespace A { extern "C" int dr341_e; } // expected-note {{previous}}
495   namespace B { extern "C" void dr341_e(); } // expected-error {{redefinition of 'dr341_e' as different kind of symbol}}
496 }
497 
498 // dr342: na
499 
500 namespace dr343 { // dr343: no
501   // FIXME: dup 1710
502   template<typename T> struct A {
503     template<typename U> struct B {};
504   };
505   // FIXME: In these contexts, the 'template' keyword is optional.
506   template<typename T> struct C : public A<T>::B<T> { // expected-error {{use 'template'}}
507     C() : A<T>::B<T>() {} // expected-error {{use 'template'}}
508   };
509 }
510 
511 namespace dr344 { // dr344: dup 1435
512   struct A { inline virtual ~A(); };
513   struct B { friend A::~A(); };
514 }
515 
516 namespace dr345 { // dr345: yes
517   struct A {
518     struct X {};
519     int X; // expected-note {{here}}
520   };
521   struct B {
522     struct X {};
523   };
524   template <class T> void f(T t) { typename T::X x; } // expected-error {{refers to non-type member 'X'}}
525   void f(A a, B b) {
526     f(b);
527     f(a); // expected-note {{instantiation}}
528   }
529 }
530 
531 // dr346: na
532 
533 namespace dr347 { // dr347: yes
534   struct base {
535     struct nested;
536     static int n;
537     static void f();
538     void g();
539   };
540 
541   struct derived : base {};
542 
543   struct derived::nested {}; // expected-error {{no struct named 'nested'}}
544   int derived::n; // expected-error {{no member named 'n'}}
545   void derived::f() {} // expected-error {{does not match any}}
546   void derived::g() {} // expected-error {{does not match any}}
547 }
548 
549 // dr348: na
550 
551 namespace dr349 { // dr349: no
552   struct A {
553     template <class T> operator T ***() {
554       int ***p = 0;
555       return p; // expected-error {{cannot initialize return object of type 'const int ***' with an lvalue of type 'int ***'}}
556     }
557   };
558 
559   // FIXME: This is valid.
560   A a;
561   const int *const *const *p1 = a; // expected-note {{in instantiation of}}
562 
563   struct B {
564     template <class T> operator T ***() {
565       const int ***p = 0;
566       return p;
567     }
568   };
569 
570   // FIXME: This is invalid.
571   B b;
572   const int *const *const *p2 = b;
573 }
574 
575 // dr351: na
576 
577 namespace dr352 { // dr352: yes
578   namespace example1 {
579     namespace A {
580       enum E {};
581       template<typename R, typename A> void foo(E, R (*)(A)); // expected-note 2{{couldn't infer template argument 'R'}}
582     }
583 
584     template<typename T> void arg(T);
585     template<typename T> int arg(T) = delete; // expected-note {{here}} expected-error 0-1{{extension}}
586 
587     void f(A::E e) {
588       foo(e, &arg); // expected-error {{no matching function}}
589 
590       using A::foo;
591       foo<int, int>(e, &arg); // expected-error {{deleted}}
592     }
593 
594     int arg(int);
595 
596     void g(A::E e) {
597       foo(e, &arg); // expected-error {{no matching function}}
598 
599       using A::foo;
600       foo<int, int>(e, &arg); // ok, uses non-template
601     }
602   }
603 
604   namespace contexts {
605     template<int I> void f1(int (&)[I]);
606     template<int I> void f2(int (&)[I+1]); // expected-note {{couldn't infer}}
607     template<int I> void f3(int (&)[I+1], int (&)[I]);
608     void f() {
609       int a[4];
610       int b[3];
611       f1(a);
612       f2(a); // expected-error {{no matching function}}
613       f3(a, b);
614     }
615 
616     template<int I> struct S {};
617     template<int I> void g1(S<I>);
618     template<int I> void g2(S<I+1>); // expected-note {{couldn't infer}}
619     template<int I> void g3(S<I+1>, S<I>);
620     void g() {
621       S<4> a;
622       S<3> b;
623       g1(a);
624       g2(a); // expected-error {{no matching function}}
625       g3(a, b);
626     }
627 
628     template<typename T> void h1(T = 0); // expected-note {{couldn't infer}}
629     template<typename T> void h2(T, T = 0);
630     void h() {
631       h1(); // expected-error {{no matching function}}
632       h1(0);
633       h1<int>();
634       h2(0);
635     }
636 
637     template<typename T> int tmpl(T);
638     template<typename R, typename A> void i1(R (*)(A)); // expected-note 3{{couldn't infer}}
639     template<typename R, typename A> void i2(R, A, R (*)(A)); // expected-note {{not viable}}
640     void i() {
641       extern int single(int);
642       i1(single);
643       i2(0, 0, single);
644 
645       extern int ambig(float), ambig(int);
646       i1(ambig); // expected-error {{no matching function}}
647       i2(0, 0, ambig);
648 
649       extern void no_match(float), no_match(int);
650       i1(no_match); // expected-error {{no matching function}}
651       i2(0, 0, no_match); // expected-error {{no matching function}}
652 
653       i1(tmpl); // expected-error {{no matching function}}
654       i2(0, 0, tmpl);
655     }
656   }
657 
658   template<typename T> struct is_int;
659   template<> struct is_int<int> {};
660 
661   namespace example2 {
662     template<typename T> int f(T (*p)(T)) { is_int<T>(); }
663     int g(int);
664     int g(char);
665     int i = f(g);
666   }
667 
668   namespace example3 {
669     template<typename T> int f(T, T (*p)(T)) { is_int<T>(); }
670     int g(int);
671     char g(char);
672     int i = f(1, g);
673   }
674 
675   namespace example4 {
676     template <class T> int f(T, T (*p)(T)) { is_int<T>(); }
677     char g(char);
678     template <class T> T g(T);
679     int i = f(1, g);
680   }
681 
682   namespace example5 {
683     template<int I> class A {};
684     template<int I> void g(A<I+1>); // expected-note {{couldn't infer}}
685     template<int I> void f(A<I>, A<I+1>);
686     void h(A<1> a1, A<2> a2) {
687       g(a1); // expected-error {{no matching function}}
688       g<0>(a1);
689       f(a1, a2);
690     }
691   }
692 }
693 
694 // dr353 needs an IRGen test.
695 
696 namespace dr354 { // dr354: yes c++11
697   // FIXME: Should we allow this in C++98 too?
698   struct S {};
699 
700   template<int*> struct ptr {}; // expected-note +{{here}}
701   ptr<0> p0;
702   ptr<(int*)0> p1;
703   ptr<(float*)0> p2;
704   ptr<(int S::*)0> p3;
705 #if __cplusplus < 201103L
706   // expected-error@-5 {{does not refer to any decl}}
707   // expected-error@-5 {{does not refer to any decl}}
708   // expected-error@-5 {{does not refer to any decl}}
709   // expected-error@-5 {{does not refer to any decl}}
710 #else
711   // expected-error@-10 {{must be cast}}
712   // ok
713   // expected-error@-10 {{does not match}}
714   // expected-error@-10 {{does not match}}
715 #endif
716 
717   template<int*> int both();
718   template<int> int both();
719   int b0 = both<0>();
720   int b1 = both<(int*)0>();
721 #if __cplusplus < 201103L
722   // expected-error@-2 {{no matching function}}
723   // expected-note@-6 {{candidate}}
724   // expected-note@-6 {{candidate}}
725 #endif
726 
727   template<int S::*> struct ptr_mem {}; // expected-note +{{here}}
728   ptr_mem<0> m0;
729   ptr_mem<(int S::*)0> m1;
730   ptr_mem<(float S::*)0> m2;
731   ptr_mem<(int *)0> m3;
732 #if __cplusplus < 201103L
733   // expected-error@-5 {{cannot be converted}}
734   // expected-error@-5 {{is not a pointer to member constant}}
735   // expected-error@-5 {{cannot be converted}}
736   // expected-error@-5 {{cannot be converted}}
737 #else
738   // expected-error@-10 {{must be cast}}
739   // ok
740   // expected-error@-10 {{does not match}}
741   // expected-error@-10 {{does not match}}
742 #endif
743 }
744 
745 struct dr355_S; // dr355: yes
746 struct ::dr355_S {}; // expected-warning {{extra qualification}}
747 namespace dr355 { struct ::dr355_S s; }
748 
749 // dr356: na
750 
751 namespace dr357 { // dr357: yes
752   template<typename T> struct A {
753     void f() const; // expected-note {{const qualified}}
754   };
755   template<typename T> void A<T>::f() {} // expected-error {{does not match}}
756 
757   struct B {
758     template<typename T> void f();
759   };
760   template<typename T> void B::f() const {} // expected-error {{does not match}}
761 }
762 
763 namespace dr358 { // dr358: yes
764   extern "C" void dr358_f();
765   namespace N {
766     int var;
767     extern "C" void dr358_f() { var = 10; }
768   }
769 }
770 
771 namespace dr359 { // dr359: yes
772   // Note, the example in the DR is wrong; it doesn't contain an anonymous
773   // union.
774   struct E {
775     union {
776       struct {
777         int x;
778       } s;
779     } v;
780 
781     union {
782       struct { // expected-error {{extension}}
783         int x;
784       } s;
785 
786       struct S { // expected-error {{types cannot be declared in an anonymous union}}
787         int x;
788       } t;
789 
790       union { // expected-error {{extension}}
791         int u;
792       };
793     };
794   };
795 }
796 
797 // dr362: na
798 // dr363: na
799 
800 namespace dr364 { // dr364: yes
801   struct S {
802     static void f(int);
803     void f(char);
804   };
805 
806   void g() {
807     S::f('a'); // expected-error {{call to non-static}}
808     S::f(0);
809   }
810 }
811 
812 #if "foo" // expected-error {{invalid token}} dr366: yes
813 #endif
814 
815 namespace dr367 { // dr367: yes
816   // FIXME: These diagnostics are terrible. Don't diagnose an ill-formed global
817   // array as being a VLA!
818   int a[true ? throw 0 : 4]; // expected-error 2{{variable length array}}
819   int b[true ? 4 : throw 0];
820   int c[true ? *new int : 4]; // expected-error 2{{variable length array}}
821   int d[true ? 4 : *new int];
822 #if __cplusplus < 201103L
823   // expected-error@-4 {{variable length array}} expected-error@-4 {{constant expression}}
824   // expected-error@-3 {{variable length array}} expected-error@-3 {{constant expression}}
825 #endif
826 }
827 
828 namespace dr368 { // dr368: yes
829   template<typename T, T> struct S {}; // expected-note {{here}}
830   template<typename T> int f(S<T, T()> *); // expected-error {{function type}}
831   //template<typename T> int g(S<T, (T())> *); // FIXME: crashes clang
832   template<typename T> int g(S<T, true ? T() : T()> *); // expected-note {{cannot have type 'dr368::X'}}
833   struct X {};
834   int n = g<X>(0); // expected-error {{no matching}}
835 }
836 
837 // dr370: na
838 
839 namespace dr372 { // dr372: no
840   namespace example1 {
841     template<typename T> struct X {
842     protected:
843       typedef T Type; // expected-note 2{{protected}}
844     };
845     template<typename T> struct Y {};
846 
847     // FIXME: These two are valid; deriving from T1<T> gives Z1 access to
848     // the protected member T1<T>::Type.
849     template<typename T,
850              template<typename> class T1,
851              template<typename> class T2> struct Z1 :
852       T1<T>,
853       T2<typename T1<T>::Type> {}; // expected-error {{protected}}
854 
855     template<typename T,
856              template<typename> class T1,
857              template<typename> class T2> struct Z2 :
858       T2<typename T1<T>::Type>, // expected-error {{protected}}
859       T1<T> {};
860 
861     Z1<int, X, Y> z1; // expected-note {{instantiation of}}
862     Z2<int, X, Y> z2; // expected-note {{instantiation of}}
863   }
864 
865   namespace example2 {
866     struct X {
867     private:
868       typedef int Type; // expected-note {{private}}
869     };
870     template<typename T> struct A {
871       typename T::Type t; // expected-error {{private}}
872     };
873     A<X> ax; // expected-note {{instantiation of}}
874   }
875 
876   namespace example3 {
877     struct A {
878     protected:
879       typedef int N; // expected-note 2{{protected}}
880     };
881 
882     template<typename T> struct B {};
883     template<typename U> struct C : U, B<typename U::N> {}; // expected-error {{protected}}
884     template<typename U> struct D : B<typename U::N>, U {}; // expected-error {{protected}}
885 
886     C<A> x; // expected-note {{instantiation of}}
887     D<A> y; // expected-note {{instantiation of}}
888   }
889 
890   namespace example4 {
891     class A {
892       class B {};
893       friend class X;
894     };
895 
896     struct X : A::B {
897       A::B mx;
898       class Y {
899         A::B my;
900       };
901     };
902   }
903 }
904 
905 namespace dr373 { // dr373: no
906   // FIXME: This is valid.
907   namespace X { int dr373; } // expected-note 2{{here}}
908   struct dr373 { // expected-note {{here}}
909     void f() {
910       using namespace dr373::X; // expected-error {{no namespace named 'X' in 'dr373::dr373'}}
911       int k = dr373; // expected-error {{does not refer to a value}}
912 
913       namespace Y = dr373::X; // expected-error {{no namespace named 'X' in 'dr373::dr373'}}
914       k = Y::dr373;
915     }
916   };
917 }
918 
919 namespace dr374 { // dr374: yes c++11
920   namespace N {
921     template<typename T> void f();
922     template<typename T> struct A { void f(); };
923   }
924   template<> void N::f<char>() {}
925   template<> void N::A<char>::f() {}
926   template<> struct N::A<int> {};
927 #if __cplusplus < 201103L
928   // expected-error@-4 {{extension}} expected-note@-7 {{here}}
929   // expected-error@-4 {{extension}} expected-note@-7 {{here}}
930   // expected-error@-4 {{extension}} expected-note@-8 {{here}}
931 #endif
932 }
933 
934 // dr375: dup 345
935 // dr376: na
936 
937 namespace dr377 { // dr377: yes
938   enum E { // expected-error {{enumeration values exceed range of largest integer}}
939     a = -__LONG_LONG_MAX__ - 1, // expected-error 0-1{{extension}}
940     b = 2 * (unsigned long long)__LONG_LONG_MAX__ // expected-error 0-2{{extension}}
941   };
942 }
943 
944 // dr378: dup 276
945 // dr379: na
946 
947 namespace dr381 { // dr381: yes
948   struct A {
949     int a;
950   };
951   struct B : virtual A {};
952   struct C : B {};
953   struct D : B {};
954   struct E : public C, public D {};
955   struct F : public A {};
956   void f() {
957     E e;
958     e.B::a = 0; // expected-error {{ambiguous conversion}}
959     F f;
960     f.A::a = 1;
961   }
962 }
963 
964 namespace dr382 { // dr382: yes c++11
965   // FIXME: Should we allow this in C++98 mode?
966   struct A { typedef int T; };
967   typename A::T t;
968   typename dr382::A a;
969 #if __cplusplus < 201103L
970   // expected-error@-3 {{occurs outside of a template}}
971   // expected-error@-3 {{occurs outside of a template}}
972 #endif
973   typename A b; // expected-error {{expected a qualified name}}
974 }
975 
976 namespace dr383 { // dr383: yes
977   struct A { A &operator=(const A&); };
978   struct B { ~B(); };
979   union C { C &operator=(const C&); };
980   union D { ~D(); };
981   int check[(__is_pod(A) || __is_pod(B) || __is_pod(C) || __is_pod(D)) ? -1 : 1];
982 }
983 
984 namespace dr384 { // dr384: yes
985   namespace N1 {
986     template<typename T> struct Base {};
987     template<typename T> struct X {
988       struct Y : public Base<T> {
989         Y operator+(int) const;
990       };
991       Y f(unsigned i) { return Y() + i; }
992     };
993   }
994 
995   namespace N2 {
996     struct Z {};
997     template<typename T> int *operator+(T, unsigned);
998   }
999 
1000   int main() {
1001     N1::X<N2::Z> v;
1002     v.f(0);
1003   }
1004 }
1005 
1006 namespace dr385 { // dr385: yes
1007   struct A { protected: void f(); };
1008   struct B : A { using A::f; };
1009   struct C : A { void g(B b) { b.f(); } };
1010   void h(B b) { b.f(); }
1011 
1012   struct D { int n; }; // expected-note {{member}}
1013   struct E : protected D {}; // expected-note 2{{protected}}
1014   struct F : E { friend int i(E); };
1015   int i(E e) { return e.n; } // expected-error {{protected base}} expected-error {{protected member}}
1016 }
1017 
1018 namespace dr387 { // dr387: yes
1019   namespace old {
1020     template<typename T> class number {
1021       number(int); // expected-note 2{{here}}
1022       friend number gcd(number &x, number &y) {}
1023     };
1024 
1025     void g() {
1026       number<double> a(3), b(4); // expected-error 2{{private}}
1027       a = gcd(a, b);
1028       b = gcd(3, 4); // expected-error {{undeclared}}
1029     }
1030   }
1031 
1032   namespace newer {
1033     template <typename T> class number {
1034     public:
1035       number(int);
1036       friend number gcd(number x, number y) { return 0; }
1037     };
1038 
1039     void g() {
1040       number<double> a(3), b(4);
1041       a = gcd(a, b);
1042       b = gcd(3, 4); // expected-error {{undeclared}}
1043     }
1044   }
1045 }
1046 
1047 // FIXME: dr388 needs codegen test
1048 
1049 namespace dr389 { // dr389: no
1050   struct S {
1051     typedef struct {} A;
1052     typedef enum {} B;
1053     typedef struct {} const C; // expected-note 0-2{{here}}
1054     typedef enum {} const D; // expected-note 0-1{{here}}
1055   };
1056   template<typename> struct T {};
1057 
1058   struct WithLinkage1 {};
1059   enum WithLinkage2 {};
1060   typedef struct {} *WithLinkage3a, WithLinkage3b;
1061   typedef enum {} WithLinkage4a, *WithLinkage4b;
1062   typedef S::A WithLinkage5;
1063   typedef const S::B WithLinkage6;
1064   typedef int WithLinkage7;
1065   typedef void (*WithLinkage8)(WithLinkage2 WithLinkage1::*, WithLinkage5 *);
1066   typedef T<WithLinkage5> WithLinkage9;
1067 
1068   typedef struct {} *WithoutLinkage1; // expected-note 0-1{{here}}
1069   typedef enum {} const WithoutLinkage2; // expected-note 0-1{{here}}
1070   // These two types don't have linkage even though they are externally visible
1071   // and the ODR requires them to be merged across TUs.
1072   typedef S::C WithoutLinkage3;
1073   typedef S::D WithoutLinkage4;
1074   typedef void (*WithoutLinkage5)(int (WithoutLinkage3::*)(char));
1075 
1076 #if __cplusplus >= 201103L
1077   // This has linkage even though its template argument does not.
1078   // FIXME: This is probably a defect.
1079   typedef T<WithoutLinkage1> WithLinkage10;
1080 #else
1081   typedef int WithLinkage10; // dummy
1082 
1083   typedef T<WithLinkage1> GoodArg1;
1084   typedef T<WithLinkage2> GoodArg2;
1085   typedef T<WithLinkage3a> GoodArg3a;
1086   typedef T<WithLinkage3b> GoodArg3b;
1087   typedef T<WithLinkage4a> GoodArg4a;
1088   typedef T<WithLinkage4b> GoodArg4b;
1089   typedef T<WithLinkage5> GoodArg5;
1090   typedef T<WithLinkage6> GoodArg6;
1091   typedef T<WithLinkage7> GoodArg7;
1092   typedef T<WithLinkage8> GoodArg8;
1093   typedef T<WithLinkage9> GoodArg9;
1094 
1095   typedef T<WithoutLinkage1> BadArg1; // expected-error{{template argument uses}}
1096   typedef T<WithoutLinkage2> BadArg2; // expected-error{{template argument uses}}
1097   typedef T<WithoutLinkage3> BadArg3; // expected-error{{template argument uses}}
1098   typedef T<WithoutLinkage4> BadArg4; // expected-error{{template argument uses}}
1099   typedef T<WithoutLinkage5> BadArg5; // expected-error{{template argument uses}}
1100 #endif
1101 
1102   extern WithLinkage1 withLinkage1;
1103   extern WithLinkage2 withLinkage2;
1104   extern WithLinkage3a withLinkage3a;
1105   extern WithLinkage3b withLinkage3b;
1106   extern WithLinkage4a withLinkage4a;
1107   extern WithLinkage4b withLinkage4b;
1108   extern WithLinkage5 withLinkage5;
1109   extern WithLinkage6 withLinkage6;
1110   extern WithLinkage7 withLinkage7;
1111   extern WithLinkage8 withLinkage8;
1112   extern WithLinkage9 withLinkage9;
1113   extern WithLinkage10 withLinkage10;
1114 
1115   // FIXME: These are all ill-formed.
1116   extern WithoutLinkage1 withoutLinkage1;
1117   extern WithoutLinkage2 withoutLinkage2;
1118   extern WithoutLinkage3 withoutLinkage3;
1119   extern WithoutLinkage4 withoutLinkage4;
1120   extern WithoutLinkage5 withoutLinkage5;
1121 
1122   // OK, extern "C".
1123   extern "C" {
1124     extern WithoutLinkage1 dr389_withoutLinkage1;
1125     extern WithoutLinkage2 dr389_withoutLinkage2;
1126     extern WithoutLinkage3 dr389_withoutLinkage3;
1127     extern WithoutLinkage4 dr389_withoutLinkage4;
1128     extern WithoutLinkage5 dr389_withoutLinkage5;
1129   }
1130 
1131   // OK, defined.
1132   WithoutLinkage1 withoutLinkageDef1;
1133   WithoutLinkage2 withoutLinkageDef2 = WithoutLinkage2();
1134   WithoutLinkage3 withoutLinkageDef3 = {};
1135   WithoutLinkage4 withoutLinkageDef4 = WithoutLinkage4();
1136   WithoutLinkage5 withoutLinkageDef5;
1137 
1138   void use(const void *);
1139   void use_all() {
1140     use(&withLinkage1); use(&withLinkage2); use(&withLinkage3a); use(&withLinkage3b);
1141     use(&withLinkage4a); use(&withLinkage4b); use(&withLinkage5); use(&withLinkage6);
1142     use(&withLinkage7); use(&withLinkage8); use(&withLinkage9); use(&withLinkage10);
1143 
1144     use(&withoutLinkage1); use(&withoutLinkage2); use(&withoutLinkage3);
1145     use(&withoutLinkage4); use(&withoutLinkage5);
1146 
1147     use(&dr389_withoutLinkage1); use(&dr389_withoutLinkage2);
1148     use(&dr389_withoutLinkage3); use(&dr389_withoutLinkage4);
1149     use(&dr389_withoutLinkage5);
1150 
1151     use(&withoutLinkageDef1); use(&withoutLinkageDef2); use(&withoutLinkageDef3);
1152     use(&withoutLinkageDef4); use(&withoutLinkageDef5);
1153   }
1154 
1155   void local() {
1156     // FIXME: This is ill-formed.
1157     extern WithoutLinkage1 withoutLinkageLocal;
1158   }
1159 }
1160 
1161 namespace dr390 { // dr390: yes
1162   template<typename T>
1163   struct A {
1164     A() { f(); } // expected-warning {{call to pure virt}}
1165     virtual void f() = 0; // expected-note {{here}}
1166     virtual ~A() = 0;
1167   };
1168   template<typename T> A<T>::~A() { T::error; } // expected-error {{cannot be used prior to}}
1169   template<typename T> void A<T>::f() { T::error; } // ok, not odr-used
1170   struct B : A<int> { // expected-note 2{{in instantiation of}}
1171     void f() {}
1172   } b;
1173 }
1174 
1175 namespace dr391 { // dr391: yes c++11
1176   // FIXME: Should this apply to C++98 too?
1177   class A { A(const A&); }; // expected-note 0-1{{here}}
1178   A fa();
1179   const A &a = fa();
1180 #if __cplusplus < 201103L
1181   // expected-error@-2 {{C++98 requires an accessible copy constructor}}
1182 #endif
1183 
1184   struct B { B(const B&) = delete; }; // expected-error 0-1{{extension}} expected-note 0-1{{here}}
1185   B fb();
1186   const B &b = fb();
1187 #if __cplusplus < 201103L
1188   // expected-error@-2 {{deleted}}
1189 #endif
1190 
1191   template<typename T>
1192   struct C {
1193     C(const C&) { T::error; }
1194   };
1195   C<int> fc();
1196   const C<int> &c = fc();
1197 }
1198 
1199 // dr392 FIXME write codegen test
1200 // dr394: na
1201 
1202 namespace dr395 { // dr395: yes
1203   struct S {
1204     template <typename T, int N>(&operator T())[N]; // expected-error {{must use a typedef}}
1205     template <typename T, int N> operator(T (&)[N])(); // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error +{{}}
1206     template <typename T> operator T *() const { return 0; }
1207     template <typename T, typename U> operator T U::*() const { return 0; }
1208     template <typename T, typename U> operator T (U::*)()() const { return 0; } // expected-error +{{}}
1209   };
1210 
1211   struct null1_t {
1212     template <class T, class U> struct ptr_mem_fun_t {
1213       typedef T (U::*type)();
1214     };
1215 
1216     template <class T, class U>
1217     operator typename ptr_mem_fun_t<T, U>::type() const { // expected-note {{couldn't infer}}
1218       return 0;
1219     }
1220   } null1;
1221   int (S::*p)() = null1; // expected-error {{no viable conversion}}
1222 
1223   template <typename T> using id = T; // expected-error 0-1{{extension}}
1224 
1225   struct T {
1226     template <typename T, int N> operator id<T[N]> &();
1227     template <typename T, typename U> operator id<T (U::*)()>() const;
1228   };
1229 
1230   struct null2_t {
1231     template<class T, class U> using ptr_mem_fun_t = T (U::*)(); // expected-error 0-1{{extension}}
1232     template<class T, class U> operator ptr_mem_fun_t<T, U>() const { return 0; };
1233   } null2;
1234   int (S::*q)() = null2;
1235 }
1236 
1237 namespace dr396 { // dr396: yes
1238   void f() {
1239     auto int a(); // expected-error {{storage class on function}}
1240     int (i); // expected-note {{previous}}
1241     auto int (i); // expected-error {{redefinition}}
1242 #if __cplusplus >= 201103L
1243   // expected-error@-4 {{'auto' storage class}} expected-error@-2 {{'auto' storage class}}
1244 #endif
1245   }
1246 }
1247 
1248 // dr397: sup 1823
1249 
1250 namespace dr398 { // dr398: yes
1251   namespace example1 {
1252     struct S {
1253       static int const I = 42;
1254     };
1255     template <int N> struct X {};
1256     template <typename T> void f(X<T::I> *) {}
1257     template <typename T> void f(X<T::J> *) {}
1258     void foo() { f<S>(0); }
1259   }
1260 
1261   namespace example2 {
1262     template <int I> struct X {};
1263     template <template <class T> class> struct Z {};
1264     template <class T> void f(typename T::Y *) {} // expected-note 2{{substitution failure}}
1265     template <class T> void g(X<T::N> *) {} // expected-note {{substitution failure}}
1266     template <class T> void h(Z<T::template TT> *) {} // expected-note {{substitution failure}}
1267     struct A {};
1268     struct B {
1269       int Y;
1270     };
1271     struct C {
1272       typedef int N;
1273     };
1274     struct D {
1275       typedef int TT;
1276     };
1277 
1278     void test() {
1279       f<A>(0); // expected-error {{no matching function}}
1280       f<B>(0); // expected-error {{no matching function}}
1281       g<C>(0); // expected-error {{no matching function}}
1282       h<D>(0); // expected-error {{no matching function}}
1283     }
1284   }
1285 }
1286