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