1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
5176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
6176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// FIXME: This is included to avoid a diagnostic with no source location
7176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// pointing at the implicit operator new. We can't match such a diagnostic
8176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// with -verify.
9176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines__extension__ typedef __SIZE_TYPE__ size_t;
10a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid *operator new(size_t); // expected-error 0-1{{missing exception spec}} expected-note{{candidate}}
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr500 { // dr500: dup 372
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class D;
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class A {
15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    class B;
16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    class C;
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    friend class D;
18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class A::B {};
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class A::C : public A::B {};
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class D : public A::B {};
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace dr501 { // dr501: yes
256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct A {
266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    friend void f() {}
276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    void g() {
286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      void (*p)() = &f; // expected-error {{undeclared identifier}}
296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  };
316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace dr502 { // dr502: yes
346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct Q {};
356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> struct A {
366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    enum E { e = 1 };
376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    void q1() { f(e); }
386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    void q2() { Q arr[sizeof(E)]; f(arr); }
396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    void q3() { Q arr[e]; f(arr); }
406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    void sanity() { Q arr[1]; f(arr); } // expected-error {{undeclared identifier 'f'}}
416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  };
426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  int f(A<int>::E);
436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<int N> int f(Q (&)[N]);
446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template struct A<int>;
456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace dr505 { // dr505: yes
486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const char *exts = "\e\(\{\[\%"; // expected-error 5{{use of non-standard escape}}
496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const char *unknown = "\Q"; // expected-error {{unknown escape sequence}}
506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace dr506 { // dr506: yes
536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct NonPod { ~NonPod(); };
546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void f(...);
556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void g(NonPod np) { f(np); } // expected-error {{cannot pass}}
566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// FIXME: Add tests here once DR260 is resolved.
596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// dr507: dup 260
606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// dr508: na
626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// dr509: na
636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// dr510: na
646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace dr512 { // dr512: yes
666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct A {
676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    A(int);
686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  };
696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  union U { A a; };
706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#if __cplusplus < 201103L
716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // expected-error@-2 {{has a non-trivial constructor}}
726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // expected-note@-6 {{no default constructor}}
736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // expected-note@-6 {{suppressed by user-declared constructor}}
746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif
756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// dr513: na
786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace dr514 { // dr514: yes
806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  namespace A { extern int x, y; }
816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  int A::x = y;
826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace dr515 { // dr515: sup 1017
856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIXME: dr1017 reverses the wording of dr515, but the current draft has
866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // dr515's wording, with a different fix for dr1017.
876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct X { int n; };
896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> struct Y : T {
906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    int f() { return X::n; }
916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  };
926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  int k = Y<X>().f();
936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct A { int a; };
956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct B { void f() { int k = sizeof(A::a); } };
966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#if __cplusplus < 201103L
976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // expected-error@-2 {{invalid use of non-static data member}}
986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif
996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
1006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// dr516: na
1026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace dr517 { // dr517: no
1046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // This is NDR, but we should diagnose it anyway.
1056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> struct S {};
1066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> int v = 0; // expected-error 0-1{{extension}}
1076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template struct S<int*>;
1096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template int v<int*>;
1106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  S<char&> s;
1126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  int k = v<char&>;
1136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIXME: These are both ill-formed.
1156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> struct S<T*> {};
1166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> int v<T*> = 0; // expected-error 0-1{{extension}}
1176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIXME: These are both ill-formed.
1196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> struct S<T&> {};
1206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> int v<T&> = 0; // expected-error 0-1{{extension}}
1216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace dr518 { // dr518: yes c++11
1246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  enum E { e, };
1256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#if __cplusplus < 201103L
1266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // expected-error@-2 {{C++11 extension}}
1276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif
1286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
1296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace dr519 { // dr519: yes
1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// FIXME: Add a codegen test.
1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#if __cplusplus >= 201103L
1336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define fold(x) (__builtin_constant_p(x) ? (x) : (x))
1346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  int test[fold((int*)(void*)0) ? -1 : 1];
1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#undef fold
1366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif
1376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// dr520: na
1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// dr521: no
1426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// FIXME: The wording here is broken. It's not reasonable to expect a
1436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// diagnostic here. Once the relevant DR gets a number, mark this as a dup.
1446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace dr522 { // dr522: yes
1466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct S {};
1476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> void b1(volatile T &);
1486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> void b2(volatile T * const *);
1496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> void b2(volatile T * const S::*);
1506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> void b2(volatile T * const S::* const *);
1516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIXME: This diagnostic isn't very good. The problem is not substitution failure.
1526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> void b2a(volatile T *S::* const *); // expected-note {{substitution failure}}
1536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> struct Base {};
1556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct Derived : Base<int> {};
1566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> void b3(Base<T>);
1576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> void b3(Base<T> *);
1586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void test(int n, const int cn, int **p, int *S::*pm) {
1606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    int *a[3], *S::*am[3];
1616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    const Derived cd = Derived();
1626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Derived d[3];
1636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    b1(n);
1656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    b1(cn);
1666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    b2(p);
1676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    b2(pm);
1686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    b2(a);
1696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    b2(am);
1706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    b2a(am); // expected-error {{no matching function}}
1716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    b3(d);
1726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    b3(cd);
1736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
1746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
1756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace dr524 { // dr524: yes
1776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> void f(T a, T b) { operator+(a, b); } // expected-error {{call}}
1786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct S {};
1806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void operator+(S, S);
1816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template void f(S, S);
1826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  namespace N { struct S {}; }
1846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void operator+(N::S, N::S); // expected-note {{should be declared}}
1856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template void f(N::S, N::S); // expected-note {{instantiation}}
1866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
1876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace dr525 { // dr525: yes
1896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  namespace before {
1906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // Note, the example was correct prior to the change; instantiation is
1916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // required for cases like this:
1926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    template <class T> struct D { operator T*(); };
1936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    void g(D<double> ppp) {
1946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      delete ppp;
1956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
1966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
1976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  namespace after {
1986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    template <class T> struct D { typename T::error e; }; // expected-error {{prior to '::'}}
1996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    void g(D<double> *ppp) {
2006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      delete ppp; // expected-note {{instantiation of}}
2016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
2026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
2036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
204c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
205176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr526 { // dr526: yes
206176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<int> struct S {};
207176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<int N> void f1(S<N> s);
208176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<int N> void f2(S<(N)> s); // expected-note {{couldn't infer}}
209176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<int N> void f3(S<+N> s); // expected-note {{couldn't infer}}
210176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<int N> void g1(int (&)[N]);
211176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<int N> void g2(int (&)[(N)]); // expected-note {{couldn't infer}}
212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<int N> void g3(int (&)[+N]); // expected-note {{couldn't infer}}
213176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
214176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void test(int (&a)[3], S<3> s) {
215176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    f1(s);
216176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    f2(s); // expected-error {{no matching}}
217176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    f3(s); // expected-error {{no matching}}
218176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    g1(a);
219176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    g2(a); // expected-error {{no matching}}
220176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    g3(a); // expected-error {{no matching}}
221176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
222176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
223176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<int N> struct X {
224176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    typedef int type;
225176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    X<N>::type v1;
226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    X<(N)>::type v2; // expected-error {{missing 'typename'}}
227176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    X<+N>::type v3; // expected-error {{missing 'typename'}}
228176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
229176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
230176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
231176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr527 { // dr527: na
232176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // This DR is meaningless. It removes a required diagnostic from the case
233176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // where a not-externally-visible object is odr-used but not defined, which
234176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // requires a diagnostic for a different reason.
235176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  extern struct { int x; } a; // FIXME: We should reject this, per dr389.
236176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static struct { int x; } b;
237176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  extern "C" struct { int x; } c;
238176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  namespace { extern struct { int x; } d; }
239176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef struct { int x; } *P;
240176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct E { static P e; }; // FIXME: We should reject this, per dr389.
241176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  namespace { struct F { static P f; }; }
242176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
243176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int ax = a.x, bx = b.x, cx = c.x, dx = d.x, ex = E::e->x, fx = F::f->x;
244176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
246176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr530 { // dr530: yes
247176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<int*> struct S { enum { N = 1 }; };
248176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<void(*)()> struct T { enum { N = 1 }; };
249176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int n;
250176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void f();
251176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int a[S<&n>::N];
252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int b[T<&f>::N];
253176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
254176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
255176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr531 { // dr531: partial
256176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  namespace good {
257176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename T> struct A {
258176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      void f(T) { T::error; }
259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      template<typename U> void g(T, U) { T::error; }
260176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      struct B { typename T::error error; };
261176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      template<typename U> struct C { typename T::error error; };
262176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      static T n;
263176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    };
264176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename T> T A<T>::n = T::error;
265176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
266176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> void A<int>::f(int) {}
267176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> template<typename U> void A<int>::g(int, U) {}
268176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> struct A<int>::B {};
269176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> template<typename U> struct A<int>::C {};
270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> int A<int>::n = 0;
271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void use(A<int> a) {
273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      a.f(a.n);
274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      a.g(0, 0);
275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      A<int>::B b;
276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      A<int>::C<int> c;
277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> struct A<char> {
280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      void f(char);
281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      template<typename U> void g(char, U);
282176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      struct B;
283176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      template<typename U> struct C;
284176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      static char n;
285176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    };
286176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
287176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void A<char>::f(char) {}
288176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename U> void A<char>::g(char, U) {}
289176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    struct A<char>::B {};
290176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename U> struct A<char>::C {};
291176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    char A<char>::n = 0;
292176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
294176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  namespace bad {
295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename T> struct A {
296176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      void f(T) { T::error; }
297176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      template<typename U> void g(T, U) { T::error; }
298176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      struct B { typename T::error error; };
299176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      template<typename U> struct C { typename T::error error; }; // expected-note {{here}}
300176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      static T n;
301176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    };
302176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename T> T A<T>::n = T::error;
303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
304176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void A<int>::f(int) {} // expected-error {{requires 'template<>'}}
305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename U> void A<int>::g(int, U) {} // expected-error {{should be empty}}
306176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    struct A<int>::B {}; // expected-error {{requires 'template<>'}}
307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename U> struct A<int>::C {}; // expected-error {{should be empty}} expected-error {{different kind of symbol}}
308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int A<int>::n = 0; // expected-error {{requires 'template<>'}}
309176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
310176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> struct A<char> { // expected-note 2{{here}}
311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      void f(char);
312176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      template<typename U> void g(char, U);
313176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      struct B; // expected-note {{here}}
314176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      template<typename U> struct C;
315176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      static char n;
316176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    };
317176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
318176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> void A<char>::f(char) {} // expected-error {{no function template matches}}
319176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // FIXME: This is ill-formed; -pedantic-errors should reject.
320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> template<typename U> void A<char>::g(char, U) {} // expected-warning {{extraneous template parameter list}}
321176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> struct A<char>::B {}; // expected-error {{extraneous 'template<>'}} expected-error {{does not specialize}}
322176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // FIXME: This is ill-formed; -pedantic-errors should reject.
323176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> template<typename U> struct A<char>::C {}; // expected-warning {{extraneous template parameter list}}
324176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> char A<char>::n = 0; // expected-error {{extraneous 'template<>'}}
325176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
326176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
327176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  namespace nested {
328176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename T> struct A {
329176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      template<typename U> struct B;
330176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    };
331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> template<typename U> struct A<int>::B {
332176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      void f();
333176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      void g();
334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      template<typename V> void h();
335176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      template<typename V> void i();
336176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    };
337176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> template<typename U> void A<int>::B<U>::f() {}
338176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename U> void A<int>::B<U>::g() {} // expected-error {{should be empty}}
339176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> template<typename U> template<typename V> void A<int>::B<U>::h() {}
341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename U> template<typename V> void A<int>::B<U>::i() {} // expected-error {{should be empty}}
342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> template<> void A<int>::B<int>::f() {}
344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> template<> template<typename V> void A<int>::B<int>::h() {}
345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> template<> template<> void A<int>::B<int>::h<int>() {}
346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
347176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> void A<int>::B<char>::f() {} // expected-error {{requires 'template<>'}}
348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<> template<typename V> void A<int>::B<char>::h() {} // expected-error {{should be empty}}
349176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
350176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
351176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
352c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// PR8130
353c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesnamespace dr532 { // dr532: 3.5
354c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  struct A { };
355c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
356c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  template<class T> struct B {
357c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    template<class R> int &operator*(R&);
358c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  };
359c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
360c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  template<class T, class R> float &operator*(T&, R&);
361c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void test() {
362c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    A a;
363c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    B<A> b;
364c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    int &ir = b * a;
365c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
366c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
367176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
368176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// dr533: na
369176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
370176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr534 { // dr534: yes
371176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct S {};
372176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> void operator+(S, T);
373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> void operator+<T*>(S, T*) {} // expected-error {{function template partial spec}}
374176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
375176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
376176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr535 { // dr535: yes
377176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  class X { private: X(const X&); };
378176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct A {
379176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    X x;
380176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename T> A(T&);
381176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
382176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct B : A {
383176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    X y;
384176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    B(volatile A&);
385176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
386176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
387176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  extern A a1;
388176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  A a2(a1); // ok, uses constructor template
389176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
390176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  extern volatile B b1;
391176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  B b2(b1); // ok, uses converting constructor
392176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
393176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void f() { throw a1; }
394176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
395176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus >= 201103L
396176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct C {
397176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    constexpr C() : n(0) {}
398176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename T> constexpr C(T&t) : n(t.n == 0 ? throw 0 : 0) {}
399176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int n;
400176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
401176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  constexpr C c() { return C(); }
402176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // ok, copy is elided
403176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  constexpr C x = c();
404176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
405176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
406176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
407176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// dr537: na
408176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// dr538: na
409176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
410176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// dr539: yes
411176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst dr539( // expected-error {{requires a type specifier}}
412176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    const a) { // expected-error {{unknown type name 'a'}}
413176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const b; // expected-error {{requires a type specifier}}
414176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  new const; // expected-error {{expected a type}}
415176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  try {} catch (const n) {} // expected-error {{unknown type name 'n'}}
416176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  try {} catch (const) {} // expected-error {{expected a type}}
417176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (const n = 0) {} // expected-error {{requires a type specifier}}
418176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  switch (const n = 0) {} // expected-error {{requires a type specifier}}
419176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (const n = 0) {} // expected-error {{requires a type specifier}}
420176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (const n = 0; // expected-error {{requires a type specifier}}
421176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines       const m = 0; ) {} // expected-error {{requires a type specifier}}
422176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  sizeof(const); // expected-error {{requires a type specifier}}
423176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct S {
424176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    const n; // expected-error {{requires a type specifier}}
425176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    operator const(); // expected-error {{expected a type}}
426176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
427176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus >= 201103L
428176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int arr[3];
429176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // FIXME: The extra braces here are to avoid the parser getting too
430176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // badly confused when recovering here. We should fix this recovery.
431176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  { for (const n // expected-error {{unknown type name 'n'}} expected-note {{}}
432176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines         : arr) ; {} } // expected-error +{{}}
433176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  (void) [](const) {}; // expected-error {{requires a type specifier}}
434176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  (void) [](const n) {}; // expected-error {{unknown type name 'n'}}
435176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  enum E : const {}; // expected-error {{expected a type}}
436176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  using T = const; // expected-error {{expected a type}}
437176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  auto f() -> const; // expected-error {{expected a type}}
438176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
439176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
440176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
441176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr540 { // dr540: yes
442176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef int &a;
443176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef const a &a; // expected-warning {{has no effect}}
444176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef const int &b;
445176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef b &b;
446176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef const a &c; // expected-note {{previous}} expected-warning {{has no effect}}
447176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef const b &c; // expected-error {{different}} expected-warning {{has no effect}}
448176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
449176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
450176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr541 { // dr541: yes
451176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<int> struct X { typedef int type; };
452176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> struct S {
453176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int f(T);
454176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
455176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int g(int);
456176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    T g(bool);
457176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
458176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int h();
459176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int h(T);
460176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void x() {
462176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // These are type-dependent expressions, even though we could
463176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // determine that all calls have type 'int'.
464176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      X<sizeof(f(0))>::type a; // expected-error +{{}}
465176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      X<sizeof(g(0))>::type b; // expected-error +{{}}
466176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      X<sizeof(h(0))>::type b; // expected-error +{{}}
467176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
468176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      typename X<sizeof(f(0))>::type a;
469176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      typename X<sizeof(h(0))>::type b;
470176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
471176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
472176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
473176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
474176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr542 { // dr542: yes
475176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus >= 201103L
476176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct A { A() = delete; int n; };
477176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  A a[32] = {}; // ok, constructor not called
478176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
479176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct B {
480176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int n;
481176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  private:
482176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    B() = default;
483176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
484176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  B b[32] = {}; // ok, constructor not called
485176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
486176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
487176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
488176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr543 { // dr543: yes
489176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // In C++98+DR543, this is valid because value-initialization doesn't call a
490176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // trivial default constructor, so we never notice that defining the
491176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // constructor would be ill-formed.
492176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  //
493176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // In C++11+DR543, this is ill-formed, because the default constructor is
494176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // deleted, and value-initialization *does* call a deleted default
495176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // constructor, even if it is trivial.
496176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct A {
497176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    const int n;
498176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
499176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  A a = A();
500176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus >= 201103L
501176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // expected-error@-2 {{deleted}}
502176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // expected-note@-5 {{would not be initialized}}
503176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
504176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
505176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
506176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr544 { // dr544: yes
507176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int *n;
508176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
509176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<class T> struct A { int n; };
510176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<class T> struct B : A<T> { int get(); };
511176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<> int B<int>::get() { return n; }
512176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int k = B<int>().get();
513176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
514176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
515176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr546 { // dr546: yes
516176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> struct A { void f(); };
517176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template struct A<int>;
518176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> void A<T>::f() { T::error; }
519176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
520176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
521176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr547 { // dr547: yes
522176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> struct X;
523a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  template<typename T> struct X<T() const> {};
524176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T, typename C> X<T> f(T C::*) { return X<T>(); }
525176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
526176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct S { void f() const; };
527a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  X<void() const> x = f(&S::f);
528176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
529176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
530176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr548 { // dr548: dup 482
531176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> struct S {};
532176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> void f() {}
533176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template struct dr548::S<int>;
534176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template void dr548::f<int>();
535176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
536176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
537176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr551 { // dr551: yes c++11
538176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // FIXME: This obviously should apply in C++98 mode too.
539176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> void f() {}
540176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template inline void f<int>();
541176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus >= 201103L
542176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // expected-error@-2 {{cannot be 'inline'}}
543176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
544176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
545176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> inline void g() {}
546176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template inline void g<int>();
547176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus >= 201103L
548176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // expected-error@-2 {{cannot be 'inline'}}
549176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
550176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
551176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> struct X {
552176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void f() {}
553176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
554176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template inline void X<int>::f();
555176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus >= 201103L
556176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // expected-error@-2 {{cannot be 'inline'}}
557176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
558176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
559176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
560176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr552 { // dr552: yes
561176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T, typename T::U> struct X {};
562176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct Y { typedef int U; };
563176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  X<Y, 0> x;
564176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
565176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
566176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct dr553_class {
567176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  friend void *operator new(size_t, dr553_class);
568176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
569176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr553 {
570176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dr553_class c;
571176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Contrary to the apparent intention of the DR, operator new is not actually
572176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // looked up with a lookup mechanism that performs ADL; the standard says it
573176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // "is looked up in global scope", where it is not visible.
574176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void *p = new (c) int; // expected-error {{no matching function}}
575176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
576176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct namespace_scope {
577176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    friend void *operator new(size_t, namespace_scope); // expected-error {{cannot be declared inside a namespace}}
578176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
579176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
580176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
581176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// dr556: na
582176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
583176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr557 { // dr557: yes
584176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> struct S {
585176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    friend void f(S<T> *);
586176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    friend void g(S<S<T> > *);
587176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
588176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void x(S<int> *p, S<S<int> > *q) {
589176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    f(p);
590176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    g(q);
591176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
592176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
593176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
594176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr558 { // dr558: yes
595176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  wchar_t a = L'\uD7FF';
596176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  wchar_t b = L'\xD7FF';
597176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  wchar_t c = L'\uD800'; // expected-error {{invalid universal character}}
598176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  wchar_t d = L'\xD800';
599176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  wchar_t e = L'\uDFFF'; // expected-error {{invalid universal character}}
600176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  wchar_t f = L'\xDFFF';
601176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  wchar_t g = L'\uE000';
602176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  wchar_t h = L'\xE000';
603176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
604176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
605176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate<typename> struct dr559 { typedef int T; dr559::T u; }; // dr559: yes
606176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
607176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr561 { // dr561: yes
608176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> void f(int);
609176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> void g(T t) {
610176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    f<T>(t);
611176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
612176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  namespace {
613176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    struct S {};
614176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename T> static void f(S);
615176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
616176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void h(S s) {
617176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    g(s);
618176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
619176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
620176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
621176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr564 { // dr564: yes
622176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  extern "C++" void f(int);
623176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void f(int); // ok
624176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  extern "C++" { extern int n; }
625176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int n; // ok
626176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
627176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
628176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr565 { // dr565: yes
629176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  namespace N {
630176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename T> int f(T); // expected-note {{target}}
631176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
632176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  using N::f; // expected-note {{using}}
633176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> int f(T*);
634176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> void f(T);
635176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T, int = 0> int f(T); // expected-error 0-1{{extension}}
636176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> int f(T, int = 0);
637176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> int f(T); // expected-error {{conflicts with}}
638176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
639176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
640176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr566 { // dr566: yes
641176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus >= 201103L
642176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int check[int(-3.99) == -3 ? 1 : -1];
643176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
644176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
645176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
646176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// dr567: na
647176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
648176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr568 { // dr568: yes c++11
649176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // FIXME: This is a DR issue against C++98, so should probably apply there
650176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // too.
651176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct x { int y; };
652176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  class trivial : x {
653176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    x y;
654176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  public:
655176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int n;
656176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
657176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int check_trivial[__is_trivial(trivial) ? 1 : -1];
658176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
659176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct std_layout {
660176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    std_layout();
661176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    std_layout(const std_layout &);
662176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ~std_layout();
663176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  private:
664176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int n;
665176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
666176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int check_std_layout[__is_standard_layout(std_layout) ? 1 : -1];
667176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
668176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct aggregate {
669176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int x;
670176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int y;
671176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    trivial t;
672176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    std_layout sl;
673176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
674176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  aggregate aggr = {};
675176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
676176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void f(...);
677176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void g(trivial t) { f(t); }
678176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus < 201103L
679176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // expected-error@-2 {{non-POD}}
680176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
681176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
682176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void jump() {
683176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    goto x;
684176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus < 201103L
685176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // expected-error@-2 {{cannot jump}}
686176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // expected-note@+2 {{non-POD}}
687176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
688176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    trivial t;
689176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  x: ;
690176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
691176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
692176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
693176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr569 { // dr569: yes c++11
694176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // FIXME: This is a DR issue against C++98, so should probably apply there
695176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // too.
696176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ;;;;;
697176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus < 201103L
698176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // expected-error@-2 {{C++11 extension}}
699176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
700176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
701176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
702176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr570 { // dr570: dup 633
703176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int n;
704176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int &r = n; // expected-note {{previous}}
705176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int &r = n; // expected-error {{redefinition}}
706176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
707176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
708176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr571 { // dr571 unknown
709176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // FIXME: Add a codegen test.
710176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef int &ir;
711176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int n;
712176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const ir r = n; // expected-warning {{has no effect}} FIXME: Test if this has internal linkage.
713176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
714176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
715176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr572 { // dr572: yes
716176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  enum E { a = 1, b = 2 };
717176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int check[a + b == 3 ? 1 : -1];
718176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
719176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
720176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr573 { // dr573: no
721176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void *a;
722176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int *b = reinterpret_cast<int*>(a);
723176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void (*c)() = reinterpret_cast<void(*)()>(a);
724176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void *d = reinterpret_cast<void*>(c);
725176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus < 201103L
726176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // expected-error@-3 {{extension}}
727176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // expected-error@-3 {{extension}}
728176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
729176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void f() { delete a; } // expected-error {{cannot delete}}
730176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int n = d - a; // expected-error {{arithmetic on pointers to void}}
731176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // FIXME: This is ill-formed.
732176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<void*> struct S;
733176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<int*> struct T;
734176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
735176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
736176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr574 { // dr574: yes
737176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct A {
738176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    A &operator=(const A&) const; // expected-note {{does not match because it is const}}
739176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
740176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct B {
741176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    B &operator=(const B&) volatile; // expected-note {{nearly matches}}
742176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
743176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus >= 201103L
744176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct C {
745176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    C &operator=(const C&) &; // expected-note {{not viable}} expected-note {{nearly matches}} expected-note {{here}}
746176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
747176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct D {
748176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    D &operator=(const D&) &&; // expected-note {{not viable}} expected-note {{nearly matches}} expected-note {{here}}
749176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
750176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void test(C c, D d) {
751176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    c = c;
752176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    C() = c; // expected-error {{no viable}}
753176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    d = d; // expected-error {{no viable}}
754176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    D() = d;
755176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
756176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
757176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct Test {
758176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    friend A &A::operator=(const A&); // expected-error {{does not match}}
759176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    friend B &B::operator=(const B&); // expected-error {{does not match}}
760176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus >= 201103L
761176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // FIXME: We shouldn't produce the 'cannot overload' diagnostics here.
762176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    friend C &C::operator=(const C&); // expected-error {{does not match}} expected-error {{cannot overload}}
763176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    friend D &D::operator=(const D&); // expected-error {{does not match}} expected-error {{cannot overload}}
764176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
765176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
766176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
767176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
768176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr575 { // dr575: yes
769176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T, typename U = typename T::type> void a(T); void a(...); // expected-error 0-1{{extension}}
770176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T, typename T::type U = 0> void b(T); void b(...); // expected-error 0-1{{extension}}
771176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T, int U = T::value> void c(T); void c(...); // expected-error 0-1{{extension}}
772176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> void d(T, int = T::value); void d(...); // expected-error {{cannot be used prior to '::'}}
773176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void x() {
774176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    a(0);
775176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    b(0);
776176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    c(0);
777176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    d(0); // expected-note {{in instantiation of default function argument}}
778176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
779176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
780176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T = int&> void f(T* = 0); // expected-error 0-1{{extension}}
781176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T = int> void f(T = 0); // expected-error 0-1{{extension}}
782176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void g() { f<>(); }
783176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
784176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> T &h(T *);
785176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> T *h(T *);
786176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void *p = h((void*)0);
787176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
788176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
789176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr576 { // dr576: yes
7900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  typedef void f() {} // expected-error {{function definition declared 'typedef'}}
791176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void f(typedef int n); // expected-error {{invalid storage class}}
792176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void f(char c) { typedef int n; }
793176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
794176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
795176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr577 { // dr577: yes
796176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef void V;
797176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef const void CV;
798176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void a(void);
799176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void b(const void); // expected-error {{qualifiers}}
800176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void c(V);
801176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void d(CV); // expected-error {{qualifiers}}
802176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void (*e)(void) = c;
803176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void (*f)(const void); // expected-error {{qualifiers}}
804176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void (*g)(V) = a;
805176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void (*h)(CV); // expected-error {{qualifiers}}
806176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> void i(T); // expected-note 2{{requires 1 arg}}
807176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> void j(void (*)(T)); // expected-note 2{{argument may not have 'void' type}}
808176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void k() {
809176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    a();
810176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    c();
811176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    i<void>(); // expected-error {{no match}}
812176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    i<const void>(); // expected-error {{no match}}
813176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    j<void>(0); // expected-error {{no match}}
814176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    j<const void>(0); // expected-error {{no match}}
815176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
816176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
817176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
818176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr580 { // dr580: no
819176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  class C;
820176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct A { static C c; };
821176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct B { static C c; };
822176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  class C {
823176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    C(); // expected-note {{here}}
824176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ~C(); // expected-note {{here}}
825176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
826176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    typedef int I; // expected-note {{here}}
827176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<int> struct X;
828176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<int> friend struct Y;
829176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<int> void f();
830176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<int> friend void g();
831176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    friend struct A;
832176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
833176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
834176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<C::I> struct C::X {};
835176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<C::I> struct Y {};
836176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<C::I> struct Z {}; // FIXME: should reject, accepted because C befriends A!
837176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
838176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<C::I> void C::f() {}
839176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<C::I> void g() {}
840176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<C::I> void h() {} // expected-error {{private}}
841176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
842176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  C A::c;
843176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  C B::c; // expected-error 2{{private}}
844176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
845176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
846176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// dr582: na
847176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
848176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr583 { // dr583: no
849176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // see n3624
850176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int *p;
851176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // FIXME: These are all ill-formed.
852176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bool b1 = p < 0;
853176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bool b2 = p > 0;
854176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bool b3 = p <= 0;
855176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bool b4 = p >= 0;
856176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
857176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
858176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// dr584: na
859176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
860176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr585 { // dr585: yes
861176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename> struct T;
862176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct A {
863176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    friend T; // expected-error {{requires a type specifier}} expected-error {{can only be classes or functions}}
864176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // FIXME: It's not clear whether the standard allows this or what it means,
865176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // but the DR585 writeup suggests it as an alternative.
866176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename U> friend T<U>; // expected-error {{must use an elaborated type}}
867176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
868176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<template<typename> class T> struct B {
869176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    friend T; // expected-error {{requires a type specifier}} expected-error {{can only be classes or functions}}
870176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename U> friend T<U>; // expected-error {{must use an elaborated type}}
871176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
872176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
873176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
874176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// dr586: na
875176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
876176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr587 { // dr587: yes
877176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> void f(bool b, const T x, T y) {
878176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    const T *p = &(b ? x : y);
879176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
880176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct S {};
881176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template void f(bool, const int, int);
882176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template void f(bool, const S, S);
883176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
884176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
885176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr588 { // dr588: yes
886176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct A { int n; }; // expected-note {{ambiguous}}
887176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> int f() {
888176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    struct S : A, T { int f() { return n; } } s;
889176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int a = s.f();
890176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int b = s.n; // expected-error {{found in multiple}}
891176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
892176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct B { int n; }; // expected-note {{ambiguous}}
893176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int k = f<B>(); // expected-note {{here}}
894176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
895176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
896176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr589 { // dr589: yes
897176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct B { };
898176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct D : B { };
899176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  D f();
900176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  extern const B &b;
901176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bool a;
902176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const B *p = &(a ? f() : b); // expected-error {{temporary}}
903176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const B *q = &(a ? D() : b); // expected-error {{temporary}}
904176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
905176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
906176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr590 { // dr590: yes
907176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> struct A {
908176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    struct B {
909176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      struct C {
910176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        A<T>::B::C f(A<T>::B::C); // ok, no 'typename' required.
911176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      };
912176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    };
913176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
914176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> typename A<T>::B::C A<T>::B::C::f(A<T>::B::C) {}
915176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
916176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
917176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr591 { // dr591: no
918176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> struct A {
919176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    typedef int M;
920176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    struct B {
921176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      typedef void M;
922176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      struct C;
923176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    };
924176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
925176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
926176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<typename T> struct A<T>::B::C : A<T> {
927176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // FIXME: Should find member of non-dependent base class A<T>.
928176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    M m; // expected-error {{incomplete type 'M' (aka 'void'}}
929176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
930176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
931176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
932176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// dr592: na
933176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// dr593 needs an IRGen test.
934176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// dr594: na
935176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
936176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr595 { // dr595: dup 1330
937176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template<class T> struct X {
938176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void f() throw(T) {}
939176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
940176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct S {
941176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    X<S> xs;
942176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
943176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
944176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
945176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// dr597: na
946176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
947176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr598 { // dr598: yes
948176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  namespace N {
949176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void f(int);
950176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void f(char);
951176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // Not found by ADL.
952176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void g(void (*)(int));
953176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void h(void (*)(int));
954176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
955176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    namespace M {
956176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      struct S {};
957176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      int &h(void (*)(S));
958176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
959176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void i(M::S);
960176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void i();
961176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
962176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int &g(void(*)(char));
963176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int &r = g(N::f);
964176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int &s = h(N::f); // expected-error {{undeclared}}
965176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int &t = h(N::i);
966176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
967176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
968176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr599 { // dr599: partial
969176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef int Fn();
970176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct S { operator void*(); };
971176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct T { operator Fn*(); };
972176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct U { operator int*(); operator void*(); }; // expected-note 2{{conversion}}
973176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct V { operator int*(); operator Fn*(); };
974176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void f(void *p, void (*q)(), S s, T t, U u, V v) {
975176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    delete p; // expected-error {{cannot delete}}
976176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    delete q; // expected-error {{cannot delete}}
977176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    delete s; // expected-error {{cannot delete}}
978176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    delete t; // expected-error {{cannot delete}}
979176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // FIXME: This is valid, but is rejected due to a non-conforming GNU
980176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // extension allowing deletion of pointers to void.
981176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    delete u; // expected-error {{ambiguous}}
982176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    delete v;
983176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
984176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
985