1b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith// RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -Wno-bind-to-temporary-copy
2b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith// 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
51c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
61c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr1 { // dr1: no
7662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith  namespace X { extern "C" void dr1_f(int a = 1); }
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace Y { extern "C" void dr1_f(int a = 1); }
91c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  using X::dr1_f; using Y::dr1_f;
101c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void g() {
11662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith    dr1_f(0);
12662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith    // FIXME: This should be rejected, due to the ambiguous default argument.
13662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith    dr1_f();
141c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
151c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  namespace X {
16662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith    using Y::dr1_f;
171c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    void h() {
181c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      dr1_f(0);
19662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith      // FIXME: This should be rejected, due to the ambiguous default argument.
201c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      dr1_f();
211c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    }
221c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
231c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
241c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  namespace X {
251c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    void z(int);
261c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
271c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void X::z(int = 1) {} // expected-note {{previous}}
281c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  namespace X {
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void z(int = 1); // expected-error {{redefinition of default argument}}
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void i(int = 1);
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void j() {
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void i(int = 1);
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    using dr1::i;
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    i(0);
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // FIXME: This should be rejected, due to the ambiguous default argument.
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    i();
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void k() {
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    using dr1::i;
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void i(int = 1);
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    i(0);
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // FIXME: This should be rejected, due to the ambiguous default argument.
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    i();
461c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
471c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
481c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
491c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr3 { // dr3: yes
501c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename T> struct A {};
511c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename T> void f(T) { A<T> a; } // expected-note {{implicit instantiation}}
521c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template void f(int);
531c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<> struct A<int> {}; // expected-error {{explicit specialization of 'dr3::A<int>' after instantiation}}
541c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
551c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
561c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr4 { // dr4: yes
571c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C" {
581c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    static void dr4_f(int) {}
591c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    static void dr4_f(float) {}
601c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    void dr4_g(int) {} // expected-note {{previous}}
611c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    void dr4_g(float) {} // expected-error {{conflicting types}}
621c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
631c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
641c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
651c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr5 { // dr5: yes
661c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct A {} a;
671c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct B {
681c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    B(const A&);
691c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    B(const B&);
701c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
711c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  const volatile B b = a;
721c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
731c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct C { C(C&); };
741c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct D : C {};
751c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct E { operator D&(); } e;
761c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  const C c = e;
771c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
781c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
792f686697187e8834346b7924797d44c978252ec6David Majnemernamespace dr7 { // dr7: yes
801c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  class A { public: ~A(); };
812f686697187e8834346b7924797d44c978252ec6David Majnemer  class B : virtual private A {}; // expected-note 2 {{declared private here}}
822f686697187e8834346b7924797d44c978252ec6David Majnemer  class C : public B {} c; // expected-error 2 {{inherited virtual base class 'dr7::A' has private destructor}} \
832f686697187e8834346b7924797d44c978252ec6David Majnemer                           // expected-note {{implicit default constructor for 'dr7::C' first required here}} \
842f686697187e8834346b7924797d44c978252ec6David Majnemer                           // expected-note {{implicit destructor for 'dr7::C' first required here}}
852f686697187e8834346b7924797d44c978252ec6David Majnemer  class VeryDerivedC : public B, virtual public A {} vdc;
861c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
871c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  class X { ~X(); }; // expected-note {{here}}
881c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  class Y : X { ~Y() {} }; // expected-error {{private destructor}}
89fc5335dd8ead65b7dc1dedd75ed32f9e74f229d0Chandler Carruth
90fc5335dd8ead65b7dc1dedd75ed32f9e74f229d0Chandler Carruth  namespace PR16370 { // This regressed the first time DR7 was fixed.
91fc5335dd8ead65b7dc1dedd75ed32f9e74f229d0Chandler Carruth    struct S1 { virtual ~S1(); };
92fc5335dd8ead65b7dc1dedd75ed32f9e74f229d0Chandler Carruth    struct S2 : S1 {};
93fc5335dd8ead65b7dc1dedd75ed32f9e74f229d0Chandler Carruth    struct S3 : S2 {};
94fc5335dd8ead65b7dc1dedd75ed32f9e74f229d0Chandler Carruth    struct S4 : virtual S2 {};
95fc5335dd8ead65b7dc1dedd75ed32f9e74f229d0Chandler Carruth    struct S5 : S3, S4 {
96fc5335dd8ead65b7dc1dedd75ed32f9e74f229d0Chandler Carruth      S5();
97fc5335dd8ead65b7dc1dedd75ed32f9e74f229d0Chandler Carruth      ~S5();
98fc5335dd8ead65b7dc1dedd75ed32f9e74f229d0Chandler Carruth    };
99fc5335dd8ead65b7dc1dedd75ed32f9e74f229d0Chandler Carruth    S5::S5() {}
100fc5335dd8ead65b7dc1dedd75ed32f9e74f229d0Chandler Carruth  }
1011c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
1021c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
1031c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr8 { // dr8: dup 45
1041c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  class A {
1051c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct U;
1061c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    static const int k = 5;
1071c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    void f();
1081c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    template<typename, int, void (A::*)()> struct T;
1091c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
1101c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    T<U, k, &A::f> *g();
1111c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
1121c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  A::T<A::U, A::k, &A::f> *A::g() { return 0; }
1131c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
1141c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
1151c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr9 { // dr9: yes
1161c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct B {
1171c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  protected:
1181c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int m; // expected-note {{here}}
1191c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    friend int R1();
1201c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
1211c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct N : protected B { // expected-note 2{{protected}}
1221c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    friend int R2();
1231c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  } n;
1241c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  int R1() { return n.m; } // expected-error {{protected base class}} expected-error {{protected member}}
1251c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  int R2() { return n.m; }
1261c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
1271c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
1281c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr10 { // dr10: dup 45
1291c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  class A {
1301c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct B {
1311c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      A::B *p;
1321c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    };
1331c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
1341c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
1351c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
1361c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr11 { // dr11: yes
1371c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename T> struct A : T {
1381c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    using typename T::U;
1391c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    U u;
1401c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
1411c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename T> struct B : T {
1421c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    using T::V;
1431c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    V v; // expected-error {{unknown type name}}
1441c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
1451c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct X { typedef int U; };
1461c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  A<X> ax;
1471c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
1481c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
1491c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr12 { // dr12: sup 239
1501c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  enum E { e };
1511c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  E &f(E, E = e);
1521c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void g() {
1531c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int &f(int, E = e);
1541c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    // Under DR12, these call two different functions.
1551c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    // Under DR239, they call the same function.
1561c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int &b = f(e);
1571c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int &c = f(1);
1581c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
1591c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
1601c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr13 { // dr13: no
162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern "C" void f(int);
163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void g(char);
164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> struct A {
166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A(void (*fp)(T));
167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> int h(void (T));
169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
170651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  A<int> a1(f); // FIXME: We should reject this.
171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  A<char> a2(g);
172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int a3 = h(f); // FIXME: We should reject this.
173651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int a4 = h(g);
174651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
176662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smithnamespace dr14 { // dr14: yes
177662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith  namespace X { extern "C" int dr14_f(); }
178662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith  namespace Y { extern "C" int dr14_f(); }
1791c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  using namespace X;
1801c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  using namespace Y;
181662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith  int k = dr14_f();
1821c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
1831c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  class C {
184662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith    int k;
1851c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    friend int Y::dr14_f();
1861c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  } c;
1871c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  namespace Z {
188662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith    extern "C" int dr14_f() { return c.k; }
1891c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
1901c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
1911c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  namespace X { typedef int T; typedef int U; } // expected-note {{candidate}}
1921c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  namespace Y { typedef int T; typedef long U; } // expected-note {{candidate}}
1931c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  T t; // ok, same type both times
1941c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  U u; // expected-error {{ambiguous}}
1951c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
1961c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
1971c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr15 { // dr15: yes
1981c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename T> void f(int); // expected-note {{previous}}
1991c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename T> void f(int = 0); // expected-error {{default arguments cannot be added}}
2001c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
2011c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
2021c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr16 { // dr16: yes
2031c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  class A { // expected-note {{here}}
2041c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    void f(); // expected-note {{here}}
2051c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    friend class C;
2061c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
2071c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  class B : A {}; // expected-note 4{{here}}
2081c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  class C : B {
2091c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    void g() {
2101c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      f(); // expected-error {{private member}} expected-error {{private base}}
2111c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      A::f(); // expected-error {{private member}} expected-error {{private base}}
2121c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    }
2131c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
2141c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
2151c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
2161c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr17 { // dr17: yes
2171c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  class A {
2181c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int n;
2191c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int f();
2201c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct C;
2211c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
2221c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct B : A {} b;
2231c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  int A::f() { return b.n; }
2241c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct A::C : A {
2251c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int g() { return n; }
2261c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
2271c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
2281c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr18: sup 577
2301c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
2311c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr19 { // dr19: yes
2321c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct A {
2331c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int n; // expected-note {{here}}
2341c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
2351c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct B : protected A { // expected-note {{here}}
2361c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
2371c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct C : B {} c;
2381c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct D : B {
2391c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int get1() { return c.n; } // expected-error {{protected member}}
2401c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int get2() { return ((A&)c).n; } // ok, A is an accessible base of B from here
2411c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
2421c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
2431c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
2441c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr20 { // dr20: yes
2451c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  class X {
2461c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  public:
2471c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    X();
2481c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  private:
2491c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    X(const X&); // expected-note {{here}}
2501c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
2511c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  X f();
2521c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  X x = f(); // expected-error {{private}}
2531c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
2541c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
25587b12b2e92c1670e551d66938a4c0a055b18b03aDavid Majnemernamespace dr21 { // dr21: yes
2561c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename T> struct A;
2571c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct X {
25887b12b2e92c1670e551d66938a4c0a055b18b03aDavid Majnemer    template<typename T = int> friend struct A; // expected-error {{default template argument not permitted on a friend template}}
25987b12b2e92c1670e551d66938a4c0a055b18b03aDavid Majnemer    template<typename T = int> friend struct B; // expected-error {{default template argument not permitted on a friend template}}
2601c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
2611c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
2621c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
2631c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr22 { // dr22: sup 481
2641c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename dr22_T = dr22_T> struct X; // expected-error {{unknown type name 'dr22_T'}}
2651c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  typedef int T;
2661c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename T = T> struct Y;
2671c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
2681c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
2691c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr23 { // dr23: yes
2701c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename T> void f(T, T); // expected-note {{candidate}}
2711c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename T> void f(T, int); // expected-note {{candidate}}
2721c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void g() { f(0, 0); } // expected-error {{ambiguous}}
2731c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
2741c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
2751c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith// dr24: na
2761c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
277b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr25 { // dr25: yes
2781c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct A {
2791c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    void f() throw(int);
2801c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
2811c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void (A::*f)() throw (int);
282b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  void (A::*g)() throw () = f; // expected-error {{is not superset of source}}
283b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  void (A::*g2)() throw () = 0;
2841c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void (A::*h)() throw (int, char) = f;
285b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  void (A::*i)() throw () = &A::f; // expected-error {{is not superset of source}}
286b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  void (A::*i2)() throw () = 0;
2871c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void (A::*j)() throw (int, char) = &A::f;
2881c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void x() {
289b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    // FIXME: Don't produce the second error here.
290b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    g2 = f; // expected-error {{is not superset}} expected-error {{incompatible}}
2911c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    h = f;
292b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    i2 = &A::f; // expected-error {{is not superset}} expected-error {{incompatible}}
2931c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    j = &A::f;
2941c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
2951c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
2961c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
2971c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr26 { // dr26: yes
2981c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct A { A(A, const A & = A()); }; // expected-error {{must pass its first argument by reference}}
2991c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct B {
3001c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    B(); // expected-note {{candidate}}
3011c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    B(const B &, B = B()); // expected-error {{no matching constructor}} expected-note {{candidate}} expected-note {{here}}
3021c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
3031c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
3041c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
3051c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr27 { // dr27: yes
3061c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  enum E { e } n;
3071c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  E &m = true ? n : n;
3081c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
3091c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
3101c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith// dr28: na
3111c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
312a41c97a5d1912ffd184381d269fd8e5a25ee5e59Richard Smithnamespace dr29 { // dr29: 3.4
3131c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void dr29_f0(); // expected-note {{here}}
3141c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void g0() { void dr29_f0(); }
3151c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C++" void g0_cxx() { void dr29_f0(); }
3161c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C" void g0_c() { void dr29_f0(); } // expected-error {{different language linkage}}
3171c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
3181c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C" void dr29_f1(); // expected-note {{here}}
3191c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void g1() { void dr29_f1(); }
3201c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C" void g1_c() { void dr29_f1(); }
3211c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C++" void g1_cxx() { void dr29_f1(); } // expected-error {{different language linkage}}
3221c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
323a41c97a5d1912ffd184381d269fd8e5a25ee5e59Richard Smith  void g2() { void dr29_f2(); } // expected-note {{here}}
324a41c97a5d1912ffd184381d269fd8e5a25ee5e59Richard Smith  extern "C" void dr29_f2(); // expected-error {{different language linkage}}
3251c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
326a41c97a5d1912ffd184381d269fd8e5a25ee5e59Richard Smith  extern "C" void g3() { void dr29_f3(); } // expected-note {{here}}
327a41c97a5d1912ffd184381d269fd8e5a25ee5e59Richard Smith  extern "C++" void dr29_f3(); // expected-error {{different language linkage}}
3281c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
329a41c97a5d1912ffd184381d269fd8e5a25ee5e59Richard Smith  extern "C++" void g4() { void dr29_f4(); } // expected-note {{here}}
330a41c97a5d1912ffd184381d269fd8e5a25ee5e59Richard Smith  extern "C" void dr29_f4(); // expected-error {{different language linkage}}
3311c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
3321c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C" void g5();
3331c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C++" void dr29_f5();
3341c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void g5() {
3351c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    void dr29_f5(); // ok, g5 is extern "C" but we're not inside the linkage-specification here.
3361c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
3371c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
3381c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C++" void g6();
3391c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C" void dr29_f6();
3401c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void g6() {
3411c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    void dr29_f6(); // ok, g6 is extern "C" but we're not inside the linkage-specification here.
3421c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
3431c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
3441c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C" void g7();
3451c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C++" void dr29_f7(); // expected-note {{here}}
3461c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C" void g7() {
3471c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    void dr29_f7(); // expected-error {{different language linkage}}
3481c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
3491c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
3501c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C++" void g8();
3511c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C" void dr29_f8(); // expected-note {{here}}
3521c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern "C++" void g8() {
3531c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    void dr29_f8(); // expected-error {{different language linkage}}
3541c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
3551c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
3561c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
357e3a404411fe651097024edece9a72afeef5f6ac3Richard Smithnamespace dr30 { // dr30: sup 468 c++11
3581c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct A {
3591c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    template<int> static int f();
3601c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  } a, *p = &a;
3611c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  int x = A::template f<0>();
3621c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  int y = a.template f<0>();
3631c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  int z = p->template f<0>();
3641c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith#if __cplusplus < 201103L
3651c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  // FIXME: It's not clear whether DR468 applies to C++98 too.
3661c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  // expected-error@-5 {{'template' keyword outside of a template}}
3671c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  // expected-error@-5 {{'template' keyword outside of a template}}
3681c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  // expected-error@-5 {{'template' keyword outside of a template}}
3691c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith#endif
3701c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
3711c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
3721c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr31 { // dr31: yes
3731c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  class X {
3741c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  private:
3751c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    void operator delete(void*); // expected-note {{here}}
3761c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
3771c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  // We would call X::operator delete if X() threw (even though it can't,
3781c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  // and even though we allocated the X using ::operator delete).
3791c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  X *p = new X; // expected-error {{private}}
3801c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
3811c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
3821c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith// dr32: na
3831c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
3841c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr33 { // dr33: yes
3851c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  namespace X { struct S; void f(void (*)(S)); } // expected-note {{candidate}}
3861c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  namespace Y { struct T; void f(void (*)(T)); } // expected-note {{candidate}}
3871c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void g(X::S);
3881c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename Z> Z g(Y::T);
3891c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void h() { f(&g); } // expected-error {{ambiguous}}
3901c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
3911c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
3921c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith// dr34: na
3931c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith// dr35: dup 178
3941c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith// dr37: sup 475
3951c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
3961c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr38 { // dr38: yes
3971c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename T> struct X {};
3981c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename T> X<T> operator+(X<T> a, X<T> b) { return a; }
3991c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template X<int> operator+<int>(X<int>, X<int>);
4001c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
4011c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
4021c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr39 { // dr39: no
4031c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  namespace example1 {
4041c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct A { int &f(int); };
4051c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct B : A {
4061c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      using A::f;
4071c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      float &f(float);
4081c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    } b;
4091c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int &r = b.f(0);
4101c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
4111c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
4121c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  namespace example2 {
4131c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct A {
4141c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      int &x(int); // expected-note {{found}}
4151c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      static int &y(int); // expected-note {{found}}
4161c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    };
4171c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct V {
4181c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      int &z(int);
4191c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    };
4201c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct B : A, virtual V {
4211c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      using A::x; // expected-note {{found}}
4221c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      float &x(float);
4231c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      using A::y; // expected-note {{found}}
4241c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      static float &y(float);
4251c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      using V::z;
4261c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      float &z(float);
4271c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    };
4280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    struct C : A, B, virtual V {} c; // expected-warning {{direct base 'dr39::example2::A' is inaccessible due to ambiguity:\n    struct dr39::example2::C -> struct dr39::example2::A\n    struct dr39::example2::C -> struct dr39::example2::B -> struct dr39::example2::A}}
4291c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int &x = c.x(0); // expected-error {{found in multiple base classes}}
4301c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    // FIXME: This is valid, because we find the same static data member either way.
4311c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int &y = c.y(0); // expected-error {{found in multiple base classes}}
4321c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int &z = c.z(0);
4331c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
4341c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
4351c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  namespace example3 {
4361c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct A { static int f(); };
4371c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct B : virtual A { using A::f; };
4381c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct C : virtual A { using A::f; };
4391c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct D : B, C {} d;
4401c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    int k = d.f();
4411c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
4421c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
4431c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  namespace example4 {
4441c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct A { int n; }; // expected-note {{found}}
4451c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct B : A {};
4461c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct C : A {};
4471c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct D : B, C { int f() { return n; } }; // expected-error {{found in multiple base-class}}
4481c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
4490012dd4846953cabbf5fe00ad13d61b1f5a3cc08Richard Smith
4500012dd4846953cabbf5fe00ad13d61b1f5a3cc08Richard Smith  namespace PR5916 {
4510012dd4846953cabbf5fe00ad13d61b1f5a3cc08Richard Smith    // FIXME: This is valid.
4520012dd4846953cabbf5fe00ad13d61b1f5a3cc08Richard Smith    struct A { int n; }; // expected-note +{{found}}
4530012dd4846953cabbf5fe00ad13d61b1f5a3cc08Richard Smith    struct B : A {};
4540012dd4846953cabbf5fe00ad13d61b1f5a3cc08Richard Smith    struct C : A {};
4550012dd4846953cabbf5fe00ad13d61b1f5a3cc08Richard Smith    struct D : B, C {};
4560012dd4846953cabbf5fe00ad13d61b1f5a3cc08Richard Smith    int k = sizeof(D::n); // expected-error {{found in multiple base}} expected-error {{unknown type name}}
4570012dd4846953cabbf5fe00ad13d61b1f5a3cc08Richard Smith#if __cplusplus >= 201103L
4580012dd4846953cabbf5fe00ad13d61b1f5a3cc08Richard Smith    decltype(D::n) n; // expected-error {{found in multiple base}}
4590012dd4846953cabbf5fe00ad13d61b1f5a3cc08Richard Smith#endif
4600012dd4846953cabbf5fe00ad13d61b1f5a3cc08Richard Smith  }
4611c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
4621c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
4631c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith// dr40: na
4641c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
4651c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr41 { // dr41: yes
4661c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct S f(S);
4671c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
4681c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
4691c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr42 { // dr42: yes
4701c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct A { static const int k = 0; };
4711c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct B : A { static const int k = A::k; };
4721c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
4731c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
4741c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith// dr43: na
4751c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
4761c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr44 { // dr44: yes
4771c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct A {
4781c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    template<int> void f();
4791c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    template<> void f<0>(); // expected-error {{explicit specialization of 'f' in class scope}}
4801c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
4811c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
4821c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
4831c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr45 { // dr45: yes
4841c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  class A {
4851c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    class B {};
4861c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    class C : B {};
4871c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    C c;
4881c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
4891c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
4901c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
4911c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr46 { // dr46: yes
4921c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename> struct A { template<typename> struct B {}; };
4931c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template template struct A<int>::B<int>; // expected-error {{expected unqualified-id}}
4941c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
4951c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr47 { // dr47: sup 329
4971c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  template<typename T> struct A {
498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    friend void f() { T t; } // expected-error {{redefinition}} expected-note {{previous}}
4991c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  };
5001c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  A<int> a;
501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  A<float> b; // expected-note {{instantiation of}}
502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
5031c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void f();
5041c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  void g() { f(); }
5051c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
5061c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
5071c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr48 { // dr48: yes
5081c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  namespace {
5091c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    struct S {
5101c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      static const int m = 0;
5111c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      static const int n = 0;
5121c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith      static const int o = 0;
5131c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith    };
5141c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  }
5151c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  int a = S::m;
5161c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  // FIXME: We should produce a 'has internal linkage but is not defined'
5171c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  // diagnostic for 'S::n'.
5181c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  const int &b = S::n;
5191c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  const int S::o;
5201c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  const int &c = S::o;
5211c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
5221c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
5231c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr49 { // dr49: yes
5240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  template<int*> struct A {}; // expected-note 0-2{{here}}
5251c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  int k;
5261c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith#if __has_feature(cxx_constexpr)
5271c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  constexpr
5281c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith#endif
5290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int *const p = &k; // expected-note 0-2{{here}}
5301c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  A<&k> a;
5310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  A<p> b;
5320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#if __cplusplus <= 201402L
5330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // expected-error@-2 {{must have its address taken}}
5340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#endif
5350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#if __cplusplus < 201103L
5360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // expected-error@-5 {{internal linkage}}
5370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#endif
5380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int *q = &k;
5390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  A<q> c;
5401c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith#if __cplusplus < 201103L
5410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // expected-error@-2 {{must have its address taken}}
5420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#else
5430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // expected-error@-4 {{constant expression}}
5440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // expected-note@-5 {{read of non-constexpr}}
5450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // expected-note@-7 {{declared here}}
5461c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith#endif
5471c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
5481c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith
5491c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smithnamespace dr50 { // dr50: yes
5501c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  struct X; // expected-note {{forward}}
5511c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  extern X *p;
5521c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  X *q = (X*)p;
5531c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  X *r = static_cast<X*>(p);
5541c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  X *s = const_cast<X*>(p);
5551c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  X *t = reinterpret_cast<X*>(p);
5561c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith  X *u = dynamic_cast<X*>(p); // expected-error {{incomplete}}
5571c7315116ffb9b7527358ef2d145c5db68fccb36Richard Smith}
558b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
559b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr51 { // dr51: yes
560b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A {};
561b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct B : A {};
562b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct S {
563b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    operator A&();
564b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    operator B&();
565b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  } s;
566b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  A &a = s;
567b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
568b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
569b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr52 { // dr52: yes
570b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A { int n; }; // expected-note {{here}}
571b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct B : private A {} b; // expected-note 2{{private}}
572b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // FIXME: This first diagnostic is very strangely worded, and seems to be bogus.
573b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int k = b.A::n; // expected-error {{'A' is a private member of 'dr52::A'}}
574b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-1 {{cannot cast 'struct B' to its private base}}
575b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
576b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
577b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr53 { // dr53: yes
578b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int n = 0;
579b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  enum E { e } x = static_cast<E>(n);
580b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
581b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
582b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr54 { // dr54: yes
583b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A { int a; } a;
584b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct V { int v; } v;
585b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct B : private A, virtual V { int b; } b; // expected-note 6{{private here}}
586b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
587b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  A &sab = static_cast<A&>(b); // expected-error {{private base}}
588b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  A *spab = static_cast<A*>(&b); // expected-error {{private base}}
589b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int A::*smab = static_cast<int A::*>(&B::b); // expected-error {{private base}}
590b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B &sba = static_cast<B&>(a); // expected-error {{private base}}
591b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B *spba = static_cast<B*>(&a); // expected-error {{private base}}
592b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int B::*smba = static_cast<int B::*>(&A::a); // expected-error {{private base}}
593b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
594b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  V &svb = static_cast<V&>(b);
595b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  V *spvb = static_cast<V*>(&b);
596b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int V::*smvb = static_cast<int V::*>(&B::b); // expected-error {{virtual base}}
597b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B &sbv = static_cast<B&>(v); // expected-error {{virtual base}}
598b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B *spbv = static_cast<B*>(&v); // expected-error {{virtual base}}
599b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int B::*smbv = static_cast<int B::*>(&V::v); // expected-error {{virtual base}}
600b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
601b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  A &cab = (A&)(b);
602b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  A *cpab = (A*)(&b);
603b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int A::*cmab = (int A::*)(&B::b);
604b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B &cba = (B&)(a);
605b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B *cpba = (B*)(&a);
606b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int B::*cmba = (int B::*)(&A::a);
607b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
608b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  V &cvb = (V&)(b);
609b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  V *cpvb = (V*)(&b);
610b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int V::*cmvb = (int V::*)(&B::b); // expected-error {{virtual base}}
611b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B &cbv = (B&)(v); // expected-error {{virtual base}}
612b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B *cpbv = (B*)(&v); // expected-error {{virtual base}}
613b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int B::*cmbv = (int B::*)(&V::v); // expected-error {{virtual base}}
614b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
615b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
616b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr55 { // dr55: yes
617b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  enum E { e = 5 };
618b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int test[(e + 1 == 6) ? 1 : -1];
619b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
620b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
621b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr56 { // dr56: yes
622b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A {
623b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    typedef int T; // expected-note {{previous}}
624b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    typedef int T; // expected-error {{redefinition}}
625b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
626b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct B {
627b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    struct X;
628b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    typedef X X; // expected-note {{previous}}
629b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    typedef X X; // expected-error {{redefinition}}
630b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
631b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
632b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
633b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr58 { // dr58: yes
634b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // FIXME: Ideally, we should have a CodeGen test for this.
635b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#if __cplusplus >= 201103L
636b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  enum E1 { E1_0 = 0, E1_1 = 1 };
637b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  enum E2 { E2_0 = 0, E2_m1 = -1 };
638b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct X { E1 e1 : 1; E2 e2 : 1; };
639b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  static_assert(X{E1_1, E2_m1}.e1 == 1, "");
640b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  static_assert(X{E1_1, E2_m1}.e2 == -1, "");
641b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#endif
642b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
643b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
644b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr59 { // dr59: yes
645b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<typename T> struct convert_to { operator T() const; };
646b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A {}; // expected-note 2{{volatile qualifier}}
647b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct B : A {}; // expected-note 2{{volatile qualifier}}
648b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#if __cplusplus >= 201103L // move constructors
649b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-note@-3 2{{volatile qualifier}}
650b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-note@-3 2{{volatile qualifier}}
651b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#endif
652b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
653b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  A a1 = convert_to<A>();
654b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  A a2 = convert_to<A&>();
655b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  A a3 = convert_to<const A>();
656b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  A a4 = convert_to<const volatile A>(); // expected-error {{no viable}}
657b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  A a5 = convert_to<const volatile A&>(); // expected-error {{no viable}}
658b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
659b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B b1 = convert_to<B>();
660b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B b2 = convert_to<B&>();
661b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B b3 = convert_to<const B>();
662b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B b4 = convert_to<const volatile B>(); // expected-error {{no viable}}
663b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B b5 = convert_to<const volatile B&>(); // expected-error {{no viable}}
664b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
665b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int n1 = convert_to<int>();
666b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int n2 = convert_to<int&>();
667b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int n3 = convert_to<const int>();
668b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int n4 = convert_to<const volatile int>();
669b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int n5 = convert_to<const volatile int&>();
670b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
671b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
672b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr60 { // dr60: yes
673b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  void f(int &);
674b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int &f(...);
675b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  const int k = 0;
676b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int &n = f(k);
677b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
678b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
67901e0b1f24af250da37faf953cd82626b360622f6David Majnemernamespace dr61 { // dr61: yes
680b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct X {
681b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    static void f();
682b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  } x;
683b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct Y {
684b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    static void f();
685b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    static void f(int);
686b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  } y;
687b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // This is (presumably) valid, because x.f does not refer to an overloaded
688b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // function name.
689b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  void (*p)() = &x.f;
69001e0b1f24af250da37faf953cd82626b360622f6David Majnemer  void (*q)() = &y.f; // expected-error {{cannot create a non-constant pointer to member function}}
691576a9af150e4ddb34fd9cbede6eb5e3cf2bae9c8David Majnemer  void (*r)() = y.f; // expected-error {{cannot create a non-constant pointer to member function}}
692b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
693b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
694b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr62 { // dr62: yes
695b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A {
696b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    struct { int n; } b;
697b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
698b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<typename T> struct X {};
699b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<typename T> T get() { return get<T>(); }
700b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<typename T> int take(T) { return 0; }
701b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
702b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  X<A> x1;
703b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  A a = get<A>();
704b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
705b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  typedef struct { } *NoNameForLinkagePtr;
706b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#if __cplusplus < 201103L
707b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-note@-2 5{{here}}
708b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#endif
709b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  NoNameForLinkagePtr noNameForLinkagePtr;
710b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
711b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct Danger {
712b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    NoNameForLinkagePtr p;
713b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
714b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
715b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  X<NoNameForLinkagePtr> x2;
716b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  X<const NoNameForLinkagePtr> x3;
717b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  NoNameForLinkagePtr p1 = get<NoNameForLinkagePtr>();
718b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  NoNameForLinkagePtr p2 = get<const NoNameForLinkagePtr>();
719b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int n1 = take(noNameForLinkagePtr);
720b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#if __cplusplus < 201103L
721b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-6 {{uses unnamed type}}
722b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-6 {{uses unnamed type}}
723b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-6 {{uses unnamed type}}
724b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-6 {{uses unnamed type}}
725b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-6 {{uses unnamed type}}
726b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#endif
727b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
728b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  X<Danger> x4;
729b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
730b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  void f() {
731b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    struct NoLinkage {};
732b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    X<NoLinkage> a;
733b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    X<const NoLinkage> b;
734b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    get<NoLinkage>();
735b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    get<const NoLinkage>();
736b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    X<void (*)(NoLinkage A::*)> c;
737b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    X<int NoLinkage::*> d;
738b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#if __cplusplus < 201103L
739b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-7 {{uses local type}}
740b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-7 {{uses local type}}
741b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-7 {{uses local type}}
742b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-7 {{uses local type}}
743b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-7 {{uses local type}}
744b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-7 {{uses local type}}
745b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#endif
746b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  }
747b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
748b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
749b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr63 { // dr63: yes
750b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<typename T> struct S { typename T::error e; };
751b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  extern S<int> *p;
752b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  void *q = p;
753b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
754b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
755b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr64 { // dr64: yes
756b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<class T> void f(T);
757b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<class T> void f(T*);
758b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<> void f(int*);
759b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<> void f<int>(int*);
760b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<> void f(int);
761b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
762b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
763b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith// dr65: na
764b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
765b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr66 { // dr66: no
766b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  namespace X {
767b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    int f(int n); // expected-note 2{{candidate}}
768b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  }
769b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  using X::f;
770b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  namespace X {
771b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    int f(int n = 0);
772b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    int f(int, int);
773b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  }
774b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // FIXME: The first two calls here should be accepted.
775b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int a = f(); // expected-error {{no matching function}}
776b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int b = f(1);
777b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int c = f(1, 2); // expected-error {{no matching function}}
778b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
779b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
780b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith// dr67: na
781b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
782b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr68 { // dr68: yes
783b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<typename T> struct X {};
784b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct ::dr68::X<int> x1;
785b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct ::dr68::template X<int> x2;
786b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#if __cplusplus < 201103L
787b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-2 {{'template' keyword outside of a template}}
788b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#endif
789b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct Y {
790b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    friend struct X<int>;
791b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    friend struct ::dr68::X<char>;
792b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    friend struct ::dr68::template X<double>;
793b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#if __cplusplus < 201103L
794b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-2 {{'template' keyword outside of a template}}
795b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#endif
796b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
797b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<typename>
798b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct Z {
799b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    friend struct ::dr68::template X<double>;
800b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    friend typename ::dr68::X<double>;
801b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#if __cplusplus < 201103L
802b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-2 {{C++11 extension}}
803b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#endif
804b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
805b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
806b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
807b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr69 { // dr69: yes
808b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<typename T> static void f() {}
809b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // FIXME: Should we warn here?
810b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  inline void g() { f<int>(); }
811b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // FIXME: This should be rejected, per [temp.explicit]p11.
812b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  extern template void f<char>();
813b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#if __cplusplus < 201103L
814b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-2 {{C++11 extension}}
815b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#endif
816b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<void(*)()> struct Q {};
817b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  Q<&f<int> > q;
818b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#if __cplusplus < 201103L
819b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // expected-error@-2 {{internal linkage}} expected-note@-11 {{here}}
820b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#endif
821b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
822b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
823b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr70 { // dr70: yes
824b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<int> struct A {};
825b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<int I, int J> int f(int (&)[I + J], A<I>, A<J>);
826b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int arr[7];
827b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int k = f(arr, A<3>(), A<4>());
828b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
829b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
830b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith// dr71: na
831b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith// dr72: dup 69
832b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
833b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#if __cplusplus >= 201103L
834b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr73 { // dr73: no
835b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // The resolution to dr73 is unworkable. Consider:
836b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int a, b;
837176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static_assert(&a + 1 != &b, ""); // expected-error {{not an integral constant expression}}
838b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
839b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith#endif
840b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
841b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr74 { // dr74: yes
842b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  enum E { k = 5 };
843b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int (*p)[k] = new int[k][k];
844b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
845b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
846b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr75 { // dr75: yes
847b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct S {
848b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    static int n = 0; // expected-error {{non-const}}
849b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
850b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
851b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
852b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr76 { // dr76: yes
853b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  const volatile int n = 1;
854b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int arr[n]; // expected-error +{{variable length array}}
855b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
856b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
857b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr77 { // dr77: yes
858b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A {
859b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    struct B {};
860b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    friend struct B;
861b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
862b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
863b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
864b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr78 { // dr78: sup ????
865b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // Under DR78, this is valid, because 'k' has static storage duration, so is
866b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // zero-initialized.
867176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const int k; // expected-error {{default initialization of an object of const}} expected-note{{add an explicit initializer to initialize 'k'}}
868b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
869b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
870b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith// dr79: na
871b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
872b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr80 { // dr80: yes
873b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A {
874b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    int A;
875b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
876b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct B {
877b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    static int B; // expected-error {{same name as its class}}
878b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
879b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct C {
880b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    int C; // expected-note {{hidden by}}
881b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    // FIXME: These diagnostics aren't very good.
882b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    C(); // expected-error {{must use 'struct' tag to refer to}} expected-error {{expected member name}}
883b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
884b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct D {
885b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    D();
886b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    int D; // expected-error {{same name as its class}}
887b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
888b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
889b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
890b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith// dr81: na
891b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith// dr82: dup 48
892b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
893b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr83 { // dr83: yes
894b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int &f(const char*);
895b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  char &f(char *);
896b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int &k = f("foo");
897b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
898b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
899b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr84 { // dr84: yes
900b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct B;
901b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A { operator B() const; };
902b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct C {};
903b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct B {
904b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    B(B&); // expected-note {{candidate}}
905b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    B(C);
906b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    operator C() const;
907b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
908b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  A a;
909b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // Cannot use B(C) / operator C() pair to construct the B from the B temporary
910b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // here.
911b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  B b = a; // expected-error {{no viable}}
912b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
913b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
9142ec2b8459392f3f2f00d816b40e73113d444d838David Majnemernamespace dr85 { // dr85: yes
915b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A {
916b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    struct B;
9172ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer    struct B {}; // expected-note{{previous declaration is here}}
9182ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer    struct B; // expected-error{{class member cannot be redeclared}}
9192ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer
9202ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer    union U;
9212ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer    union U {}; // expected-note{{previous declaration is here}}
9222ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer    union U; // expected-error{{class member cannot be redeclared}}
9232ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer
9242ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer#if __cplusplus >= 201103L
9252ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer    enum E1 : int;
9262ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer    enum E1 : int { e1 }; // expected-note{{previous declaration is here}}
9272ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer    enum E1 : int; // expected-error{{class member cannot be redeclared}}
9282ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer
9292ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer    enum class E2;
9302ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer    enum class E2 { e2 }; // expected-note{{previous declaration is here}}
9312ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer    enum class E2; // expected-error{{class member cannot be redeclared}}
9322ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer#endif
9332ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer  };
9342ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer
9352ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer  template <typename T>
9362ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer  struct C {
9372ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer    struct B {}; // expected-note{{previous declaration is here}}
9382ec2b8459392f3f2f00d816b40e73113d444d838David Majnemer    struct B; // expected-error{{class member cannot be redeclared}}
939b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
940b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
941b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
942b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith// dr86: dup 446
943b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
944b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr87 { // dr87: no
945b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<typename T> struct X {};
946b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // FIXME: This is invalid.
947b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  X<void() throw()> x;
948b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  // ... but this is valid.
949b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  X<void(void() throw())> y;
950b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
951b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
952b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr88 { // dr88: yes
953b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<typename T> struct S {
954651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    static const int a = 1; // expected-note {{previous}}
955b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    static const int b;
956b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
957651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<> const int S<int>::a = 4; // expected-error {{already has an initializer}}
958b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<> const int S<int>::b = 4;
959b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
960b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
961b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith// dr89: na
962b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
963b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr90 { // dr90: yes
964b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A {
965b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    template<typename T> friend void dr90_f(T);
966b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
967b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct B : A {
968b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    template<typename T> friend void dr90_g(T);
969b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    struct C {};
970b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    union D {};
971b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
972b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct E : B {};
973b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct F : B::C {};
974b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
975b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  void test() {
976b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    dr90_f(A());
977b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    dr90_f(B());
978b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    dr90_f(B::C()); // expected-error {{undeclared identifier}}
979b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    dr90_f(B::D()); // expected-error {{undeclared identifier}}
980b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    dr90_f(E());
981b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    dr90_f(F()); // expected-error {{undeclared identifier}}
982b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
983b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    dr90_g(A()); // expected-error {{undeclared identifier}}
984b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    dr90_g(B());
985b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    dr90_g(B::C());
986b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    dr90_g(B::D());
987b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    dr90_g(E());
988b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    dr90_g(F()); // expected-error {{undeclared identifier}}
989b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  }
990b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
991b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
992b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr91 { // dr91: yes
993b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  union U { friend int f(U); };
994b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int k = f(U());
995b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
996b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
997651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr92 { // dr92: yes
998651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f() throw(int, float);
999651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void (*p)() throw(int) = &f; // expected-error {{target exception specification is not superset of source}}
1000651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void (*q)() throw(int);
1001651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void (**pp)() throw() = &q; // expected-error {{exception specifications are not allowed}}
1002651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1003651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void g(void() throw());
1004651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void h() {
1005651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    g(f); // expected-error {{is not superset}}
1006651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    g(q); // expected-error {{is not superset}}
1007651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
10090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // Prior to C++17, this is OK because the exception specification is not
10100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // considered in this context. In C++17, we *do* perform an implicit
10110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // conversion (which performs initialization), but we convert to the type of
10120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // the template parameter, which does not include the exception specification.
1013651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<void() throw()> struct X {};
1014651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  X<&f> xp; // ok
1015651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1016651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1017b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith// dr93: na
1018b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
1019b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr94 { // dr94: yes
1020b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A { static const int n = 5; };
1021b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int arr[A::n];
1022b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
1023b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
1024b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr95 { // dr95: yes
1025b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A;
1026b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct B;
1027b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  namespace N {
1028b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    class C {
1029b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith      friend struct A;
1030b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith      friend struct B;
1031b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith      static void f(); // expected-note {{here}}
1032b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    };
1033b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    struct A *p; // dr95::A, not dr95::N::A.
1034b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  }
1035b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  A *q = N::p; // ok, same type
1036b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct B { void f() { N::C::f(); } }; // expected-error {{private}}
1037b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
1038b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
1039b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr96 { // dr96: no
1040b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A {
1041b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    void f(int);
1042b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    template<typename T> int f(T);
1043b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    template<typename T> struct S {};
1044b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  } a;
1045b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<template<typename> class X> struct B {};
1046b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
1047b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<typename T>
1048b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  void test() {
1049b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    int k1 = a.template f<int>(0);
1050b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    // FIXME: This is ill-formed, because 'f' is not a template-id and does not
1051b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    // name a class template.
1052b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    // FIXME: What about alias templates?
1053b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    int k2 = a.template f(1);
1054b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    A::template S<int> s;
1055b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    B<A::template S> b;
1056b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  }
1057b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
1058b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
1059b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr97 { // dr97: yes
1060b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  struct A {
1061b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    static const int a = false;
1062b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    static const int b = !a;
1063b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  };
1064b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
1065b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
1066b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr98 { // dr98: yes
1067b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  void test(int n) {
1068b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    switch (n) {
1069b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith      try { // expected-note 2{{bypasses}}
1070176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case 0: // expected-error {{cannot jump}}
1071b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith        x:
1072b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith          throw n;
1073b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith      } catch (...) { // expected-note 2{{bypasses}}
1074176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case 1: // expected-error {{cannot jump}}
1075b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith        y:
1076b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith          throw n;
1077b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith      }
1078b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith      case 2:
1079176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        goto x; // expected-error {{cannot jump}}
1080b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith      case 3:
1081176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        goto y; // expected-error {{cannot jump}}
1082b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith    }
1083b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  }
1084b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
1085b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith
1086b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smithnamespace dr99 { // dr99: sup 214
1087b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<typename T> void f(T&);
1088b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  template<typename T> int &f(const T&);
1089b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  const int n = 0;
1090b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith  int &r = f(n);
1091b28e88c18ade461f54d0f2faefb1cacb209586e2Richard Smith}
1092