1*67e74705SXin Li // RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -Wno-bind-to-temporary-copy 2*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple 3*67e74705SXin Li // RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple 4*67e74705SXin Li // RUN: %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple 5*67e74705SXin Li 6*67e74705SXin Li namespace dr1 { // dr1: no 7*67e74705SXin Li namespace X { extern "C" void dr1_f(int a = 1); } 8*67e74705SXin Li namespace Y { extern "C" void dr1_f(int a = 1); } 9*67e74705SXin Li using X::dr1_f; using Y::dr1_f; g()10*67e74705SXin Li void g() { 11*67e74705SXin Li dr1_f(0); 12*67e74705SXin Li // FIXME: This should be rejected, due to the ambiguous default argument. 13*67e74705SXin Li dr1_f(); 14*67e74705SXin Li } 15*67e74705SXin Li namespace X { 16*67e74705SXin Li using Y::dr1_f; h()17*67e74705SXin Li void h() { 18*67e74705SXin Li dr1_f(0); 19*67e74705SXin Li // FIXME: This should be rejected, due to the ambiguous default argument. 20*67e74705SXin Li dr1_f(); 21*67e74705SXin Li } 22*67e74705SXin Li } 23*67e74705SXin Li 24*67e74705SXin Li namespace X { 25*67e74705SXin Li void z(int); 26*67e74705SXin Li } z(int=1)27*67e74705SXin Li void X::z(int = 1) {} // expected-note {{previous}} 28*67e74705SXin Li namespace X { 29*67e74705SXin Li void z(int = 1); // expected-error {{redefinition of default argument}} 30*67e74705SXin Li } 31*67e74705SXin Li 32*67e74705SXin Li void i(int = 1); j()33*67e74705SXin Li void j() { 34*67e74705SXin Li void i(int = 1); 35*67e74705SXin Li using dr1::i; 36*67e74705SXin Li i(0); 37*67e74705SXin Li // FIXME: This should be rejected, due to the ambiguous default argument. 38*67e74705SXin Li i(); 39*67e74705SXin Li } k()40*67e74705SXin Li void k() { 41*67e74705SXin Li using dr1::i; 42*67e74705SXin Li void i(int = 1); 43*67e74705SXin Li i(0); 44*67e74705SXin Li // FIXME: This should be rejected, due to the ambiguous default argument. 45*67e74705SXin Li i(); 46*67e74705SXin Li } 47*67e74705SXin Li } 48*67e74705SXin Li 49*67e74705SXin Li namespace dr3 { // dr3: yes 50*67e74705SXin Li template<typename T> struct A {}; f(T)51*67e74705SXin Li template<typename T> void f(T) { A<T> a; } // expected-note {{implicit instantiation}} 52*67e74705SXin Li template void f(int); 53*67e74705SXin Li template<> struct A<int> {}; // expected-error {{explicit specialization of 'dr3::A<int>' after instantiation}} 54*67e74705SXin Li } 55*67e74705SXin Li 56*67e74705SXin Li namespace dr4 { // dr4: yes 57*67e74705SXin Li extern "C" { dr4_f(int)58*67e74705SXin Li static void dr4_f(int) {} dr4_f(float)59*67e74705SXin Li static void dr4_f(float) {} dr4_g(int)60*67e74705SXin Li void dr4_g(int) {} // expected-note {{previous}} dr4_g(float)61*67e74705SXin Li void dr4_g(float) {} // expected-error {{conflicting types}} 62*67e74705SXin Li } 63*67e74705SXin Li } 64*67e74705SXin Li 65*67e74705SXin Li namespace dr5 { // dr5: yes 66*67e74705SXin Li struct A {} a; 67*67e74705SXin Li struct B { 68*67e74705SXin Li B(const A&); 69*67e74705SXin Li B(const B&); 70*67e74705SXin Li }; 71*67e74705SXin Li const volatile B b = a; 72*67e74705SXin Li 73*67e74705SXin Li struct C { C(C&); }; 74*67e74705SXin Li struct D : C {}; 75*67e74705SXin Li struct E { operator D&(); } e; 76*67e74705SXin Li const C c = e; 77*67e74705SXin Li } 78*67e74705SXin Li 79*67e74705SXin Li namespace dr7 { // dr7: yes 80*67e74705SXin Li class A { public: ~A(); }; 81*67e74705SXin Li class B : virtual private A {}; // expected-note 2 {{declared private here}} 82*67e74705SXin Li class C : public B {} c; // expected-error 2 {{inherited virtual base class 'dr7::A' has private destructor}} \ 83*67e74705SXin Li // expected-note {{implicit default constructor for 'dr7::C' first required here}} \ 84*67e74705SXin Li // expected-note {{implicit destructor for 'dr7::C' first required here}} 85*67e74705SXin Li class VeryDerivedC : public B, virtual public A {} vdc; 86*67e74705SXin Li 87*67e74705SXin Li class X { ~X(); }; // expected-note {{here}} ~Y()88*67e74705SXin Li class Y : X { ~Y() {} }; // expected-error {{private destructor}} 89*67e74705SXin Li 90*67e74705SXin Li namespace PR16370 { // This regressed the first time DR7 was fixed. 91*67e74705SXin Li struct S1 { virtual ~S1(); }; 92*67e74705SXin Li struct S2 : S1 {}; 93*67e74705SXin Li struct S3 : S2 {}; 94*67e74705SXin Li struct S4 : virtual S2 {}; 95*67e74705SXin Li struct S5 : S3, S4 { 96*67e74705SXin Li S5(); 97*67e74705SXin Li ~S5(); 98*67e74705SXin Li }; S5()99*67e74705SXin Li S5::S5() {} 100*67e74705SXin Li } 101*67e74705SXin Li } 102*67e74705SXin Li 103*67e74705SXin Li namespace dr8 { // dr8: dup 45 104*67e74705SXin Li class A { 105*67e74705SXin Li struct U; 106*67e74705SXin Li static const int k = 5; 107*67e74705SXin Li void f(); 108*67e74705SXin Li template<typename, int, void (A::*)()> struct T; 109*67e74705SXin Li 110*67e74705SXin Li T<U, k, &A::f> *g(); 111*67e74705SXin Li }; g()112*67e74705SXin Li A::T<A::U, A::k, &A::f> *A::g() { return 0; } 113*67e74705SXin Li } 114*67e74705SXin Li 115*67e74705SXin Li namespace dr9 { // dr9: yes 116*67e74705SXin Li struct B { 117*67e74705SXin Li protected: 118*67e74705SXin Li int m; // expected-note {{here}} 119*67e74705SXin Li friend int R1(); 120*67e74705SXin Li }; 121*67e74705SXin Li struct N : protected B { // expected-note 2{{protected}} 122*67e74705SXin Li friend int R2(); 123*67e74705SXin Li } n; R1()124*67e74705SXin Li int R1() { return n.m; } // expected-error {{protected base class}} expected-error {{protected member}} R2()125*67e74705SXin Li int R2() { return n.m; } 126*67e74705SXin Li } 127*67e74705SXin Li 128*67e74705SXin Li namespace dr10 { // dr10: dup 45 129*67e74705SXin Li class A { 130*67e74705SXin Li struct B { 131*67e74705SXin Li A::B *p; 132*67e74705SXin Li }; 133*67e74705SXin Li }; 134*67e74705SXin Li } 135*67e74705SXin Li 136*67e74705SXin Li namespace dr11 { // dr11: yes 137*67e74705SXin Li template<typename T> struct A : T { 138*67e74705SXin Li using typename T::U; 139*67e74705SXin Li U u; 140*67e74705SXin Li }; 141*67e74705SXin Li template<typename T> struct B : T { 142*67e74705SXin Li using T::V; 143*67e74705SXin Li V v; // expected-error {{unknown type name}} 144*67e74705SXin Li }; 145*67e74705SXin Li struct X { typedef int U; }; 146*67e74705SXin Li A<X> ax; 147*67e74705SXin Li } 148*67e74705SXin Li 149*67e74705SXin Li namespace dr12 { // dr12: sup 239 150*67e74705SXin Li enum E { e }; 151*67e74705SXin Li E &f(E, E = e); g()152*67e74705SXin Li void g() { 153*67e74705SXin Li int &f(int, E = e); 154*67e74705SXin Li // Under DR12, these call two different functions. 155*67e74705SXin Li // Under DR239, they call the same function. 156*67e74705SXin Li int &b = f(e); 157*67e74705SXin Li int &c = f(1); 158*67e74705SXin Li } 159*67e74705SXin Li } 160*67e74705SXin Li 161*67e74705SXin Li namespace dr13 { // dr13: no 162*67e74705SXin Li extern "C" void f(int); 163*67e74705SXin Li void g(char); 164*67e74705SXin Li 165*67e74705SXin Li template<typename T> struct A { 166*67e74705SXin Li A(void (*fp)(T)); 167*67e74705SXin Li }; 168*67e74705SXin Li template<typename T> int h(void (T)); 169*67e74705SXin Li 170*67e74705SXin Li A<int> a1(f); // FIXME: We should reject this. 171*67e74705SXin Li A<char> a2(g); 172*67e74705SXin Li int a3 = h(f); // FIXME: We should reject this. 173*67e74705SXin Li int a4 = h(g); 174*67e74705SXin Li } 175*67e74705SXin Li 176*67e74705SXin Li namespace dr14 { // dr14: yes 177*67e74705SXin Li namespace X { extern "C" int dr14_f(); } 178*67e74705SXin Li namespace Y { extern "C" int dr14_f(); } 179*67e74705SXin Li using namespace X; 180*67e74705SXin Li using namespace Y; 181*67e74705SXin Li int k = dr14_f(); 182*67e74705SXin Li 183*67e74705SXin Li class C { 184*67e74705SXin Li int k; 185*67e74705SXin Li friend int Y::dr14_f(); 186*67e74705SXin Li } c; 187*67e74705SXin Li namespace Z { dr14_f()188*67e74705SXin Li extern "C" int dr14_f() { return c.k; } 189*67e74705SXin Li } 190*67e74705SXin Li 191*67e74705SXin Li namespace X { typedef int T; typedef int U; } // expected-note {{candidate}} 192*67e74705SXin Li namespace Y { typedef int T; typedef long U; } // expected-note {{candidate}} 193*67e74705SXin Li T t; // ok, same type both times 194*67e74705SXin Li U u; // expected-error {{ambiguous}} 195*67e74705SXin Li } 196*67e74705SXin Li 197*67e74705SXin Li namespace dr15 { // dr15: yes 198*67e74705SXin Li template<typename T> void f(int); // expected-note {{previous}} 199*67e74705SXin Li template<typename T> void f(int = 0); // expected-error {{default arguments cannot be added}} 200*67e74705SXin Li } 201*67e74705SXin Li 202*67e74705SXin Li namespace dr16 { // dr16: yes 203*67e74705SXin Li class A { // expected-note {{here}} 204*67e74705SXin Li void f(); // expected-note {{here}} 205*67e74705SXin Li friend class C; 206*67e74705SXin Li }; 207*67e74705SXin Li class B : A {}; // expected-note 4{{here}} 208*67e74705SXin Li class C : B { g()209*67e74705SXin Li void g() { 210*67e74705SXin Li f(); // expected-error {{private member}} expected-error {{private base}} 211*67e74705SXin Li A::f(); // expected-error {{private member}} expected-error {{private base}} 212*67e74705SXin Li } 213*67e74705SXin Li }; 214*67e74705SXin Li } 215*67e74705SXin Li 216*67e74705SXin Li namespace dr17 { // dr17: yes 217*67e74705SXin Li class A { 218*67e74705SXin Li int n; 219*67e74705SXin Li int f(); 220*67e74705SXin Li struct C; 221*67e74705SXin Li }; 222*67e74705SXin Li struct B : A {} b; f()223*67e74705SXin Li int A::f() { return b.n; } 224*67e74705SXin Li struct A::C : A { gdr17::A::C225*67e74705SXin Li int g() { return n; } 226*67e74705SXin Li }; 227*67e74705SXin Li } 228*67e74705SXin Li 229*67e74705SXin Li // dr18: sup 577 230*67e74705SXin Li 231*67e74705SXin Li namespace dr19 { // dr19: yes 232*67e74705SXin Li struct A { 233*67e74705SXin Li int n; // expected-note {{here}} 234*67e74705SXin Li }; 235*67e74705SXin Li struct B : protected A { // expected-note {{here}} 236*67e74705SXin Li }; 237*67e74705SXin Li struct C : B {} c; 238*67e74705SXin Li struct D : B { get1dr19::D239*67e74705SXin Li int get1() { return c.n; } // expected-error {{protected member}} get2dr19::D240*67e74705SXin Li int get2() { return ((A&)c).n; } // ok, A is an accessible base of B from here 241*67e74705SXin Li }; 242*67e74705SXin Li } 243*67e74705SXin Li 244*67e74705SXin Li namespace dr20 { // dr20: yes 245*67e74705SXin Li class X { 246*67e74705SXin Li public: 247*67e74705SXin Li X(); 248*67e74705SXin Li private: 249*67e74705SXin Li X(const X&); // expected-note {{here}} 250*67e74705SXin Li }; 251*67e74705SXin Li X f(); 252*67e74705SXin Li X x = f(); // expected-error {{private}} 253*67e74705SXin Li } 254*67e74705SXin Li 255*67e74705SXin Li namespace dr21 { // dr21: yes 256*67e74705SXin Li template<typename T> struct A; 257*67e74705SXin Li struct X { 258*67e74705SXin Li template<typename T = int> friend struct A; // expected-error {{default template argument not permitted on a friend template}} 259*67e74705SXin Li template<typename T = int> friend struct B; // expected-error {{default template argument not permitted on a friend template}} 260*67e74705SXin Li }; 261*67e74705SXin Li } 262*67e74705SXin Li 263*67e74705SXin Li namespace dr22 { // dr22: sup 481 264*67e74705SXin Li template<typename dr22_T = dr22_T> struct X; // expected-error {{unknown type name 'dr22_T'}} 265*67e74705SXin Li typedef int T; 266*67e74705SXin Li template<typename T = T> struct Y; 267*67e74705SXin Li } 268*67e74705SXin Li 269*67e74705SXin Li namespace dr23 { // dr23: yes 270*67e74705SXin Li template<typename T> void f(T, T); // expected-note {{candidate}} 271*67e74705SXin Li template<typename T> void f(T, int); // expected-note {{candidate}} g()272*67e74705SXin Li void g() { f(0, 0); } // expected-error {{ambiguous}} 273*67e74705SXin Li } 274*67e74705SXin Li 275*67e74705SXin Li // dr24: na 276*67e74705SXin Li 277*67e74705SXin Li namespace dr25 { // dr25: yes 278*67e74705SXin Li struct A { 279*67e74705SXin Li void f() throw(int); 280*67e74705SXin Li }; 281*67e74705SXin Li void (A::*f)() throw (int); 282*67e74705SXin Li void (A::*g)() throw () = f; // expected-error {{is not superset of source}} 283*67e74705SXin Li void (A::*g2)() throw () = 0; 284*67e74705SXin Li void (A::*h)() throw (int, char) = f; 285*67e74705SXin Li void (A::*i)() throw () = &A::f; // expected-error {{is not superset of source}} 286*67e74705SXin Li void (A::*i2)() throw () = 0; 287*67e74705SXin Li void (A::*j)() throw (int, char) = &A::f; x()288*67e74705SXin Li void x() { 289*67e74705SXin Li // FIXME: Don't produce the second error here. 290*67e74705SXin Li g2 = f; // expected-error {{is not superset}} expected-error {{incompatible}} 291*67e74705SXin Li h = f; 292*67e74705SXin Li i2 = &A::f; // expected-error {{is not superset}} expected-error {{incompatible}} 293*67e74705SXin Li j = &A::f; 294*67e74705SXin Li } 295*67e74705SXin Li } 296*67e74705SXin Li 297*67e74705SXin Li namespace dr26 { // dr26: yes 298*67e74705SXin Li struct A { A(A, const A & = A()); }; // expected-error {{must pass its first argument by reference}} 299*67e74705SXin Li struct B { 300*67e74705SXin Li B(); // expected-note {{candidate}} 301*67e74705SXin Li B(const B &, B = B()); // expected-error {{no matching constructor}} expected-note {{candidate}} expected-note {{here}} 302*67e74705SXin Li }; 303*67e74705SXin Li } 304*67e74705SXin Li 305*67e74705SXin Li namespace dr27 { // dr27: yes 306*67e74705SXin Li enum E { e } n; 307*67e74705SXin Li E &m = true ? n : n; 308*67e74705SXin Li } 309*67e74705SXin Li 310*67e74705SXin Li // dr28: na 311*67e74705SXin Li 312*67e74705SXin Li namespace dr29 { // dr29: 3.4 313*67e74705SXin Li void dr29_f0(); // expected-note {{here}} g0()314*67e74705SXin Li void g0() { void dr29_f0(); } g0_cxx()315*67e74705SXin Li extern "C++" void g0_cxx() { void dr29_f0(); } g0_c()316*67e74705SXin Li extern "C" void g0_c() { void dr29_f0(); } // expected-error {{different language linkage}} 317*67e74705SXin Li 318*67e74705SXin Li extern "C" void dr29_f1(); // expected-note {{here}} g1()319*67e74705SXin Li void g1() { void dr29_f1(); } g1_c()320*67e74705SXin Li extern "C" void g1_c() { void dr29_f1(); } g1_cxx()321*67e74705SXin Li extern "C++" void g1_cxx() { void dr29_f1(); } // expected-error {{different language linkage}} 322*67e74705SXin Li g2()323*67e74705SXin Li void g2() { void dr29_f2(); } // expected-note {{here}} 324*67e74705SXin Li extern "C" void dr29_f2(); // expected-error {{different language linkage}} 325*67e74705SXin Li g3()326*67e74705SXin Li extern "C" void g3() { void dr29_f3(); } // expected-note {{here}} 327*67e74705SXin Li extern "C++" void dr29_f3(); // expected-error {{different language linkage}} 328*67e74705SXin Li g4()329*67e74705SXin Li extern "C++" void g4() { void dr29_f4(); } // expected-note {{here}} 330*67e74705SXin Li extern "C" void dr29_f4(); // expected-error {{different language linkage}} 331*67e74705SXin Li 332*67e74705SXin Li extern "C" void g5(); 333*67e74705SXin Li extern "C++" void dr29_f5(); g5()334*67e74705SXin Li void g5() { 335*67e74705SXin Li void dr29_f5(); // ok, g5 is extern "C" but we're not inside the linkage-specification here. 336*67e74705SXin Li } 337*67e74705SXin Li 338*67e74705SXin Li extern "C++" void g6(); 339*67e74705SXin Li extern "C" void dr29_f6(); g6()340*67e74705SXin Li void g6() { 341*67e74705SXin Li void dr29_f6(); // ok, g6 is extern "C" but we're not inside the linkage-specification here. 342*67e74705SXin Li } 343*67e74705SXin Li 344*67e74705SXin Li extern "C" void g7(); 345*67e74705SXin Li extern "C++" void dr29_f7(); // expected-note {{here}} g7()346*67e74705SXin Li extern "C" void g7() { 347*67e74705SXin Li void dr29_f7(); // expected-error {{different language linkage}} 348*67e74705SXin Li } 349*67e74705SXin Li 350*67e74705SXin Li extern "C++" void g8(); 351*67e74705SXin Li extern "C" void dr29_f8(); // expected-note {{here}} g8()352*67e74705SXin Li extern "C++" void g8() { 353*67e74705SXin Li void dr29_f8(); // expected-error {{different language linkage}} 354*67e74705SXin Li } 355*67e74705SXin Li } 356*67e74705SXin Li 357*67e74705SXin Li namespace dr30 { // dr30: sup 468 c++11 358*67e74705SXin Li struct A { 359*67e74705SXin Li template<int> static int f(); 360*67e74705SXin Li } a, *p = &a; 361*67e74705SXin Li int x = A::template f<0>(); 362*67e74705SXin Li int y = a.template f<0>(); 363*67e74705SXin Li int z = p->template f<0>(); 364*67e74705SXin Li #if __cplusplus < 201103L 365*67e74705SXin Li // FIXME: It's not clear whether DR468 applies to C++98 too. 366*67e74705SXin Li // expected-error@-5 {{'template' keyword outside of a template}} 367*67e74705SXin Li // expected-error@-5 {{'template' keyword outside of a template}} 368*67e74705SXin Li // expected-error@-5 {{'template' keyword outside of a template}} 369*67e74705SXin Li #endif 370*67e74705SXin Li } 371*67e74705SXin Li 372*67e74705SXin Li namespace dr31 { // dr31: yes 373*67e74705SXin Li class X { 374*67e74705SXin Li private: 375*67e74705SXin Li void operator delete(void*); // expected-note {{here}} 376*67e74705SXin Li }; 377*67e74705SXin Li // We would call X::operator delete if X() threw (even though it can't, 378*67e74705SXin Li // and even though we allocated the X using ::operator delete). 379*67e74705SXin Li X *p = new X; // expected-error {{private}} 380*67e74705SXin Li } 381*67e74705SXin Li 382*67e74705SXin Li // dr32: na 383*67e74705SXin Li 384*67e74705SXin Li namespace dr33 { // dr33: yes 385*67e74705SXin Li namespace X { struct S; void f(void (*)(S)); } // expected-note {{candidate}} 386*67e74705SXin Li namespace Y { struct T; void f(void (*)(T)); } // expected-note {{candidate}} 387*67e74705SXin Li void g(X::S); 388*67e74705SXin Li template<typename Z> Z g(Y::T); h()389*67e74705SXin Li void h() { f(&g); } // expected-error {{ambiguous}} 390*67e74705SXin Li } 391*67e74705SXin Li 392*67e74705SXin Li // dr34: na 393*67e74705SXin Li // dr35: dup 178 394*67e74705SXin Li // dr37: sup 475 395*67e74705SXin Li 396*67e74705SXin Li namespace dr38 { // dr38: yes 397*67e74705SXin Li template<typename T> struct X {}; operator +(X<T> a,X<T> b)398*67e74705SXin Li template<typename T> X<T> operator+(X<T> a, X<T> b) { return a; } 399*67e74705SXin Li template X<int> operator+<int>(X<int>, X<int>); 400*67e74705SXin Li } 401*67e74705SXin Li 402*67e74705SXin Li namespace dr39 { // dr39: no 403*67e74705SXin Li namespace example1 { 404*67e74705SXin Li struct A { int &f(int); }; 405*67e74705SXin Li struct B : A { 406*67e74705SXin Li using A::f; 407*67e74705SXin Li float &f(float); 408*67e74705SXin Li } b; 409*67e74705SXin Li int &r = b.f(0); 410*67e74705SXin Li } 411*67e74705SXin Li 412*67e74705SXin Li namespace example2 { 413*67e74705SXin Li struct A { 414*67e74705SXin Li int &x(int); // expected-note {{found}} 415*67e74705SXin Li static int &y(int); // expected-note {{found}} 416*67e74705SXin Li }; 417*67e74705SXin Li struct V { 418*67e74705SXin Li int &z(int); 419*67e74705SXin Li }; 420*67e74705SXin Li struct B : A, virtual V { 421*67e74705SXin Li using A::x; // expected-note {{found}} 422*67e74705SXin Li float &x(float); 423*67e74705SXin Li using A::y; // expected-note {{found}} 424*67e74705SXin Li static float &y(float); 425*67e74705SXin Li using V::z; 426*67e74705SXin Li float &z(float); 427*67e74705SXin Li }; 428*67e74705SXin Li 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}} 429*67e74705SXin Li int &x = c.x(0); // expected-error {{found in multiple base classes}} 430*67e74705SXin Li // FIXME: This is valid, because we find the same static data member either way. 431*67e74705SXin Li int &y = c.y(0); // expected-error {{found in multiple base classes}} 432*67e74705SXin Li int &z = c.z(0); 433*67e74705SXin Li } 434*67e74705SXin Li 435*67e74705SXin Li namespace example3 { 436*67e74705SXin Li struct A { static int f(); }; 437*67e74705SXin Li struct B : virtual A { using A::f; }; 438*67e74705SXin Li struct C : virtual A { using A::f; }; 439*67e74705SXin Li struct D : B, C {} d; 440*67e74705SXin Li int k = d.f(); 441*67e74705SXin Li } 442*67e74705SXin Li 443*67e74705SXin Li namespace example4 { 444*67e74705SXin Li struct A { int n; }; // expected-note {{found}} 445*67e74705SXin Li struct B : A {}; 446*67e74705SXin Li struct C : A {}; fdr39::example4::D447*67e74705SXin Li struct D : B, C { int f() { return n; } }; // expected-error {{found in multiple base-class}} 448*67e74705SXin Li } 449*67e74705SXin Li 450*67e74705SXin Li namespace PR5916 { 451*67e74705SXin Li // FIXME: This is valid. 452*67e74705SXin Li struct A { int n; }; // expected-note +{{found}} 453*67e74705SXin Li struct B : A {}; 454*67e74705SXin Li struct C : A {}; 455*67e74705SXin Li struct D : B, C {}; 456*67e74705SXin Li int k = sizeof(D::n); // expected-error {{found in multiple base}} expected-error {{unknown type name}} 457*67e74705SXin Li #if __cplusplus >= 201103L 458*67e74705SXin Li decltype(D::n) n; // expected-error {{found in multiple base}} 459*67e74705SXin Li #endif 460*67e74705SXin Li } 461*67e74705SXin Li } 462*67e74705SXin Li 463*67e74705SXin Li // dr40: na 464*67e74705SXin Li 465*67e74705SXin Li namespace dr41 { // dr41: yes 466*67e74705SXin Li struct S f(S); 467*67e74705SXin Li } 468*67e74705SXin Li 469*67e74705SXin Li namespace dr42 { // dr42: yes 470*67e74705SXin Li struct A { static const int k = 0; }; 471*67e74705SXin Li struct B : A { static const int k = A::k; }; 472*67e74705SXin Li } 473*67e74705SXin Li 474*67e74705SXin Li // dr43: na 475*67e74705SXin Li 476*67e74705SXin Li namespace dr44 { // dr44: yes 477*67e74705SXin Li struct A { 478*67e74705SXin Li template<int> void f(); 479*67e74705SXin Li template<> void f<0>(); // expected-error {{explicit specialization of 'f' in class scope}} 480*67e74705SXin Li }; 481*67e74705SXin Li } 482*67e74705SXin Li 483*67e74705SXin Li namespace dr45 { // dr45: yes 484*67e74705SXin Li class A { 485*67e74705SXin Li class B {}; 486*67e74705SXin Li class C : B {}; 487*67e74705SXin Li C c; 488*67e74705SXin Li }; 489*67e74705SXin Li } 490*67e74705SXin Li 491*67e74705SXin Li namespace dr46 { // dr46: yes 492*67e74705SXin Li template<typename> struct A { template<typename> struct B {}; }; 493*67e74705SXin Li template template struct A<int>::B<int>; // expected-error {{expected unqualified-id}} 494*67e74705SXin Li } 495*67e74705SXin Li 496*67e74705SXin Li namespace dr47 { // dr47: sup 329 497*67e74705SXin Li template<typename T> struct A { f()498*67e74705SXin Li friend void f() { T t; } // expected-error {{redefinition}} expected-note {{previous}} 499*67e74705SXin Li }; 500*67e74705SXin Li A<int> a; 501*67e74705SXin Li A<float> b; // expected-note {{instantiation of}} 502*67e74705SXin Li 503*67e74705SXin Li void f(); g()504*67e74705SXin Li void g() { f(); } 505*67e74705SXin Li } 506*67e74705SXin Li 507*67e74705SXin Li namespace dr48 { // dr48: yes 508*67e74705SXin Li namespace { 509*67e74705SXin Li struct S { 510*67e74705SXin Li static const int m = 0; 511*67e74705SXin Li static const int n = 0; 512*67e74705SXin Li static const int o = 0; 513*67e74705SXin Li }; 514*67e74705SXin Li } 515*67e74705SXin Li int a = S::m; 516*67e74705SXin Li // FIXME: We should produce a 'has internal linkage but is not defined' 517*67e74705SXin Li // diagnostic for 'S::n'. 518*67e74705SXin Li const int &b = S::n; 519*67e74705SXin Li const int S::o; 520*67e74705SXin Li const int &c = S::o; 521*67e74705SXin Li } 522*67e74705SXin Li 523*67e74705SXin Li namespace dr49 { // dr49: yes 524*67e74705SXin Li template<int*> struct A {}; // expected-note 0-2{{here}} 525*67e74705SXin Li int k; 526*67e74705SXin Li #if __has_feature(cxx_constexpr) 527*67e74705SXin Li constexpr 528*67e74705SXin Li #endif 529*67e74705SXin Li int *const p = &k; // expected-note 0-2{{here}} 530*67e74705SXin Li A<&k> a; 531*67e74705SXin Li A<p> b; 532*67e74705SXin Li #if __cplusplus <= 201402L 533*67e74705SXin Li // expected-error@-2 {{must have its address taken}} 534*67e74705SXin Li #endif 535*67e74705SXin Li #if __cplusplus < 201103L 536*67e74705SXin Li // expected-error@-5 {{internal linkage}} 537*67e74705SXin Li #endif 538*67e74705SXin Li int *q = &k; 539*67e74705SXin Li A<q> c; 540*67e74705SXin Li #if __cplusplus < 201103L 541*67e74705SXin Li // expected-error@-2 {{must have its address taken}} 542*67e74705SXin Li #else 543*67e74705SXin Li // expected-error@-4 {{constant expression}} 544*67e74705SXin Li // expected-note@-5 {{read of non-constexpr}} 545*67e74705SXin Li // expected-note@-7 {{declared here}} 546*67e74705SXin Li #endif 547*67e74705SXin Li } 548*67e74705SXin Li 549*67e74705SXin Li namespace dr50 { // dr50: yes 550*67e74705SXin Li struct X; // expected-note {{forward}} 551*67e74705SXin Li extern X *p; 552*67e74705SXin Li X *q = (X*)p; 553*67e74705SXin Li X *r = static_cast<X*>(p); 554*67e74705SXin Li X *s = const_cast<X*>(p); 555*67e74705SXin Li X *t = reinterpret_cast<X*>(p); 556*67e74705SXin Li X *u = dynamic_cast<X*>(p); // expected-error {{incomplete}} 557*67e74705SXin Li } 558*67e74705SXin Li 559*67e74705SXin Li namespace dr51 { // dr51: yes 560*67e74705SXin Li struct A {}; 561*67e74705SXin Li struct B : A {}; 562*67e74705SXin Li struct S { 563*67e74705SXin Li operator A&(); 564*67e74705SXin Li operator B&(); 565*67e74705SXin Li } s; 566*67e74705SXin Li A &a = s; 567*67e74705SXin Li } 568*67e74705SXin Li 569*67e74705SXin Li namespace dr52 { // dr52: yes 570*67e74705SXin Li struct A { int n; }; // expected-note {{here}} 571*67e74705SXin Li struct B : private A {} b; // expected-note 2{{private}} 572*67e74705SXin Li // FIXME: This first diagnostic is very strangely worded, and seems to be bogus. 573*67e74705SXin Li int k = b.A::n; // expected-error {{'A' is a private member of 'dr52::A'}} 574*67e74705SXin Li // expected-error@-1 {{cannot cast 'struct B' to its private base}} 575*67e74705SXin Li } 576*67e74705SXin Li 577*67e74705SXin Li namespace dr53 { // dr53: yes 578*67e74705SXin Li int n = 0; 579*67e74705SXin Li enum E { e } x = static_cast<E>(n); 580*67e74705SXin Li } 581*67e74705SXin Li 582*67e74705SXin Li namespace dr54 { // dr54: yes 583*67e74705SXin Li struct A { int a; } a; 584*67e74705SXin Li struct V { int v; } v; 585*67e74705SXin Li struct B : private A, virtual V { int b; } b; // expected-note 6{{private here}} 586*67e74705SXin Li 587*67e74705SXin Li A &sab = static_cast<A&>(b); // expected-error {{private base}} 588*67e74705SXin Li A *spab = static_cast<A*>(&b); // expected-error {{private base}} 589*67e74705SXin Li int A::*smab = static_cast<int A::*>(&B::b); // expected-error {{private base}} 590*67e74705SXin Li B &sba = static_cast<B&>(a); // expected-error {{private base}} 591*67e74705SXin Li B *spba = static_cast<B*>(&a); // expected-error {{private base}} 592*67e74705SXin Li int B::*smba = static_cast<int B::*>(&A::a); // expected-error {{private base}} 593*67e74705SXin Li 594*67e74705SXin Li V &svb = static_cast<V&>(b); 595*67e74705SXin Li V *spvb = static_cast<V*>(&b); 596*67e74705SXin Li int V::*smvb = static_cast<int V::*>(&B::b); // expected-error {{virtual base}} 597*67e74705SXin Li B &sbv = static_cast<B&>(v); // expected-error {{virtual base}} 598*67e74705SXin Li B *spbv = static_cast<B*>(&v); // expected-error {{virtual base}} 599*67e74705SXin Li int B::*smbv = static_cast<int B::*>(&V::v); // expected-error {{virtual base}} 600*67e74705SXin Li 601*67e74705SXin Li A &cab = (A&)(b); 602*67e74705SXin Li A *cpab = (A*)(&b); 603*67e74705SXin Li int A::*cmab = (int A::*)(&B::b); 604*67e74705SXin Li B &cba = (B&)(a); 605*67e74705SXin Li B *cpba = (B*)(&a); 606*67e74705SXin Li int B::*cmba = (int B::*)(&A::a); 607*67e74705SXin Li 608*67e74705SXin Li V &cvb = (V&)(b); 609*67e74705SXin Li V *cpvb = (V*)(&b); 610*67e74705SXin Li int V::*cmvb = (int V::*)(&B::b); // expected-error {{virtual base}} 611*67e74705SXin Li B &cbv = (B&)(v); // expected-error {{virtual base}} 612*67e74705SXin Li B *cpbv = (B*)(&v); // expected-error {{virtual base}} 613*67e74705SXin Li int B::*cmbv = (int B::*)(&V::v); // expected-error {{virtual base}} 614*67e74705SXin Li } 615*67e74705SXin Li 616*67e74705SXin Li namespace dr55 { // dr55: yes 617*67e74705SXin Li enum E { e = 5 }; 618*67e74705SXin Li int test[(e + 1 == 6) ? 1 : -1]; 619*67e74705SXin Li } 620*67e74705SXin Li 621*67e74705SXin Li namespace dr56 { // dr56: yes 622*67e74705SXin Li struct A { 623*67e74705SXin Li typedef int T; // expected-note {{previous}} 624*67e74705SXin Li typedef int T; // expected-error {{redefinition}} 625*67e74705SXin Li }; 626*67e74705SXin Li struct B { 627*67e74705SXin Li struct X; 628*67e74705SXin Li typedef X X; // expected-note {{previous}} 629*67e74705SXin Li typedef X X; // expected-error {{redefinition}} 630*67e74705SXin Li }; 631*67e74705SXin Li } 632*67e74705SXin Li 633*67e74705SXin Li namespace dr58 { // dr58: yes 634*67e74705SXin Li // FIXME: Ideally, we should have a CodeGen test for this. 635*67e74705SXin Li #if __cplusplus >= 201103L 636*67e74705SXin Li enum E1 { E1_0 = 0, E1_1 = 1 }; 637*67e74705SXin Li enum E2 { E2_0 = 0, E2_m1 = -1 }; 638*67e74705SXin Li struct X { E1 e1 : 1; E2 e2 : 1; }; 639*67e74705SXin Li static_assert(X{E1_1, E2_m1}.e1 == 1, ""); 640*67e74705SXin Li static_assert(X{E1_1, E2_m1}.e2 == -1, ""); 641*67e74705SXin Li #endif 642*67e74705SXin Li } 643*67e74705SXin Li 644*67e74705SXin Li namespace dr59 { // dr59: yes 645*67e74705SXin Li template<typename T> struct convert_to { operator T() const; }; 646*67e74705SXin Li struct A {}; // expected-note 2{{volatile qualifier}} 647*67e74705SXin Li struct B : A {}; // expected-note 2{{volatile qualifier}} 648*67e74705SXin Li #if __cplusplus >= 201103L // move constructors 649*67e74705SXin Li // expected-note@-3 2{{volatile qualifier}} 650*67e74705SXin Li // expected-note@-3 2{{volatile qualifier}} 651*67e74705SXin Li #endif 652*67e74705SXin Li 653*67e74705SXin Li A a1 = convert_to<A>(); 654*67e74705SXin Li A a2 = convert_to<A&>(); 655*67e74705SXin Li A a3 = convert_to<const A>(); 656*67e74705SXin Li A a4 = convert_to<const volatile A>(); // expected-error {{no viable}} 657*67e74705SXin Li A a5 = convert_to<const volatile A&>(); // expected-error {{no viable}} 658*67e74705SXin Li 659*67e74705SXin Li B b1 = convert_to<B>(); 660*67e74705SXin Li B b2 = convert_to<B&>(); 661*67e74705SXin Li B b3 = convert_to<const B>(); 662*67e74705SXin Li B b4 = convert_to<const volatile B>(); // expected-error {{no viable}} 663*67e74705SXin Li B b5 = convert_to<const volatile B&>(); // expected-error {{no viable}} 664*67e74705SXin Li 665*67e74705SXin Li int n1 = convert_to<int>(); 666*67e74705SXin Li int n2 = convert_to<int&>(); 667*67e74705SXin Li int n3 = convert_to<const int>(); 668*67e74705SXin Li int n4 = convert_to<const volatile int>(); 669*67e74705SXin Li int n5 = convert_to<const volatile int&>(); 670*67e74705SXin Li } 671*67e74705SXin Li 672*67e74705SXin Li namespace dr60 { // dr60: yes 673*67e74705SXin Li void f(int &); 674*67e74705SXin Li int &f(...); 675*67e74705SXin Li const int k = 0; 676*67e74705SXin Li int &n = f(k); 677*67e74705SXin Li } 678*67e74705SXin Li 679*67e74705SXin Li namespace dr61 { // dr61: yes 680*67e74705SXin Li struct X { 681*67e74705SXin Li static void f(); 682*67e74705SXin Li } x; 683*67e74705SXin Li struct Y { 684*67e74705SXin Li static void f(); 685*67e74705SXin Li static void f(int); 686*67e74705SXin Li } y; 687*67e74705SXin Li // This is (presumably) valid, because x.f does not refer to an overloaded 688*67e74705SXin Li // function name. 689*67e74705SXin Li void (*p)() = &x.f; 690*67e74705SXin Li void (*q)() = &y.f; // expected-error {{cannot create a non-constant pointer to member function}} 691*67e74705SXin Li void (*r)() = y.f; // expected-error {{cannot create a non-constant pointer to member function}} 692*67e74705SXin Li } 693*67e74705SXin Li 694*67e74705SXin Li namespace dr62 { // dr62: yes 695*67e74705SXin Li struct A { 696*67e74705SXin Li struct { int n; } b; 697*67e74705SXin Li }; 698*67e74705SXin Li template<typename T> struct X {}; get()699*67e74705SXin Li template<typename T> T get() { return get<T>(); } take(T)700*67e74705SXin Li template<typename T> int take(T) { return 0; } 701*67e74705SXin Li 702*67e74705SXin Li X<A> x1; 703*67e74705SXin Li A a = get<A>(); 704*67e74705SXin Li 705*67e74705SXin Li typedef struct { } *NoNameForLinkagePtr; 706*67e74705SXin Li #if __cplusplus < 201103L 707*67e74705SXin Li // expected-note@-2 5{{here}} 708*67e74705SXin Li #endif 709*67e74705SXin Li NoNameForLinkagePtr noNameForLinkagePtr; 710*67e74705SXin Li 711*67e74705SXin Li struct Danger { 712*67e74705SXin Li NoNameForLinkagePtr p; 713*67e74705SXin Li }; 714*67e74705SXin Li 715*67e74705SXin Li X<NoNameForLinkagePtr> x2; 716*67e74705SXin Li X<const NoNameForLinkagePtr> x3; 717*67e74705SXin Li NoNameForLinkagePtr p1 = get<NoNameForLinkagePtr>(); 718*67e74705SXin Li NoNameForLinkagePtr p2 = get<const NoNameForLinkagePtr>(); 719*67e74705SXin Li int n1 = take(noNameForLinkagePtr); 720*67e74705SXin Li #if __cplusplus < 201103L 721*67e74705SXin Li // expected-error@-6 {{uses unnamed type}} 722*67e74705SXin Li // expected-error@-6 {{uses unnamed type}} 723*67e74705SXin Li // expected-error@-6 {{uses unnamed type}} 724*67e74705SXin Li // expected-error@-6 {{uses unnamed type}} 725*67e74705SXin Li // expected-error@-6 {{uses unnamed type}} 726*67e74705SXin Li #endif 727*67e74705SXin Li 728*67e74705SXin Li X<Danger> x4; 729*67e74705SXin Li f()730*67e74705SXin Li void f() { 731*67e74705SXin Li struct NoLinkage {}; 732*67e74705SXin Li X<NoLinkage> a; 733*67e74705SXin Li X<const NoLinkage> b; 734*67e74705SXin Li get<NoLinkage>(); 735*67e74705SXin Li get<const NoLinkage>(); 736*67e74705SXin Li X<void (*)(NoLinkage A::*)> c; 737*67e74705SXin Li X<int NoLinkage::*> d; 738*67e74705SXin Li #if __cplusplus < 201103L 739*67e74705SXin Li // expected-error@-7 {{uses local type}} 740*67e74705SXin Li // expected-error@-7 {{uses local type}} 741*67e74705SXin Li // expected-error@-7 {{uses local type}} 742*67e74705SXin Li // expected-error@-7 {{uses local type}} 743*67e74705SXin Li // expected-error@-7 {{uses local type}} 744*67e74705SXin Li // expected-error@-7 {{uses local type}} 745*67e74705SXin Li #endif 746*67e74705SXin Li } 747*67e74705SXin Li } 748*67e74705SXin Li 749*67e74705SXin Li namespace dr63 { // dr63: yes 750*67e74705SXin Li template<typename T> struct S { typename T::error e; }; 751*67e74705SXin Li extern S<int> *p; 752*67e74705SXin Li void *q = p; 753*67e74705SXin Li } 754*67e74705SXin Li 755*67e74705SXin Li namespace dr64 { // dr64: yes 756*67e74705SXin Li template<class T> void f(T); 757*67e74705SXin Li template<class T> void f(T*); 758*67e74705SXin Li template<> void f(int*); 759*67e74705SXin Li template<> void f<int>(int*); 760*67e74705SXin Li template<> void f(int); 761*67e74705SXin Li } 762*67e74705SXin Li 763*67e74705SXin Li // dr65: na 764*67e74705SXin Li 765*67e74705SXin Li namespace dr66 { // dr66: no 766*67e74705SXin Li namespace X { 767*67e74705SXin Li int f(int n); // expected-note 2{{candidate}} 768*67e74705SXin Li } 769*67e74705SXin Li using X::f; 770*67e74705SXin Li namespace X { 771*67e74705SXin Li int f(int n = 0); 772*67e74705SXin Li int f(int, int); 773*67e74705SXin Li } 774*67e74705SXin Li // FIXME: The first two calls here should be accepted. 775*67e74705SXin Li int a = f(); // expected-error {{no matching function}} 776*67e74705SXin Li int b = f(1); 777*67e74705SXin Li int c = f(1, 2); // expected-error {{no matching function}} 778*67e74705SXin Li } 779*67e74705SXin Li 780*67e74705SXin Li // dr67: na 781*67e74705SXin Li 782*67e74705SXin Li namespace dr68 { // dr68: yes 783*67e74705SXin Li template<typename T> struct X {}; 784*67e74705SXin Li struct ::dr68::X<int> x1; 785*67e74705SXin Li struct ::dr68::template X<int> x2; 786*67e74705SXin Li #if __cplusplus < 201103L 787*67e74705SXin Li // expected-error@-2 {{'template' keyword outside of a template}} 788*67e74705SXin Li #endif 789*67e74705SXin Li struct Y { 790*67e74705SXin Li friend struct X<int>; 791*67e74705SXin Li friend struct ::dr68::X<char>; 792*67e74705SXin Li friend struct ::dr68::template X<double>; 793*67e74705SXin Li #if __cplusplus < 201103L 794*67e74705SXin Li // expected-error@-2 {{'template' keyword outside of a template}} 795*67e74705SXin Li #endif 796*67e74705SXin Li }; 797*67e74705SXin Li template<typename> 798*67e74705SXin Li struct Z { 799*67e74705SXin Li friend struct ::dr68::template X<double>; 800*67e74705SXin Li friend typename ::dr68::X<double>; 801*67e74705SXin Li #if __cplusplus < 201103L 802*67e74705SXin Li // expected-error@-2 {{C++11 extension}} 803*67e74705SXin Li #endif 804*67e74705SXin Li }; 805*67e74705SXin Li } 806*67e74705SXin Li 807*67e74705SXin Li namespace dr69 { // dr69: yes f()808*67e74705SXin Li template<typename T> static void f() {} 809*67e74705SXin Li // FIXME: Should we warn here? g()810*67e74705SXin Li inline void g() { f<int>(); } 811*67e74705SXin Li // FIXME: This should be rejected, per [temp.explicit]p11. 812*67e74705SXin Li extern template void f<char>(); 813*67e74705SXin Li #if __cplusplus < 201103L 814*67e74705SXin Li // expected-error@-2 {{C++11 extension}} 815*67e74705SXin Li #endif 816*67e74705SXin Li template<void(*)()> struct Q {}; 817*67e74705SXin Li Q<&f<int> > q; 818*67e74705SXin Li #if __cplusplus < 201103L 819*67e74705SXin Li // expected-error@-2 {{internal linkage}} expected-note@-11 {{here}} 820*67e74705SXin Li #endif 821*67e74705SXin Li } 822*67e74705SXin Li 823*67e74705SXin Li namespace dr70 { // dr70: yes 824*67e74705SXin Li template<int> struct A {}; 825*67e74705SXin Li template<int I, int J> int f(int (&)[I + J], A<I>, A<J>); 826*67e74705SXin Li int arr[7]; 827*67e74705SXin Li int k = f(arr, A<3>(), A<4>()); 828*67e74705SXin Li } 829*67e74705SXin Li 830*67e74705SXin Li // dr71: na 831*67e74705SXin Li // dr72: dup 69 832*67e74705SXin Li 833*67e74705SXin Li #if __cplusplus >= 201103L 834*67e74705SXin Li namespace dr73 { // dr73: no 835*67e74705SXin Li // The resolution to dr73 is unworkable. Consider: 836*67e74705SXin Li int a, b; 837*67e74705SXin Li static_assert(&a + 1 != &b, ""); // expected-error {{not an integral constant expression}} 838*67e74705SXin Li } 839*67e74705SXin Li #endif 840*67e74705SXin Li 841*67e74705SXin Li namespace dr74 { // dr74: yes 842*67e74705SXin Li enum E { k = 5 }; 843*67e74705SXin Li int (*p)[k] = new int[k][k]; 844*67e74705SXin Li } 845*67e74705SXin Li 846*67e74705SXin Li namespace dr75 { // dr75: yes 847*67e74705SXin Li struct S { 848*67e74705SXin Li static int n = 0; // expected-error {{non-const}} 849*67e74705SXin Li }; 850*67e74705SXin Li } 851*67e74705SXin Li 852*67e74705SXin Li namespace dr76 { // dr76: yes 853*67e74705SXin Li const volatile int n = 1; 854*67e74705SXin Li int arr[n]; // expected-error +{{variable length array}} 855*67e74705SXin Li } 856*67e74705SXin Li 857*67e74705SXin Li namespace dr77 { // dr77: yes 858*67e74705SXin Li struct A { 859*67e74705SXin Li struct B {}; 860*67e74705SXin Li friend struct B; 861*67e74705SXin Li }; 862*67e74705SXin Li } 863*67e74705SXin Li 864*67e74705SXin Li namespace dr78 { // dr78: sup ???? 865*67e74705SXin Li // Under DR78, this is valid, because 'k' has static storage duration, so is 866*67e74705SXin Li // zero-initialized. 867*67e74705SXin Li const int k; // expected-error {{default initialization of an object of const}} 868*67e74705SXin Li } 869*67e74705SXin Li 870*67e74705SXin Li // dr79: na 871*67e74705SXin Li 872*67e74705SXin Li namespace dr80 { // dr80: yes 873*67e74705SXin Li struct A { 874*67e74705SXin Li int A; 875*67e74705SXin Li }; 876*67e74705SXin Li struct B { 877*67e74705SXin Li static int B; // expected-error {{same name as its class}} 878*67e74705SXin Li }; 879*67e74705SXin Li struct C { 880*67e74705SXin Li int C; // expected-note {{hidden by}} 881*67e74705SXin Li // FIXME: These diagnostics aren't very good. 882*67e74705SXin Li C(); // expected-error {{must use 'struct' tag to refer to}} expected-error {{expected member name}} 883*67e74705SXin Li }; 884*67e74705SXin Li struct D { 885*67e74705SXin Li D(); 886*67e74705SXin Li int D; // expected-error {{same name as its class}} 887*67e74705SXin Li }; 888*67e74705SXin Li } 889*67e74705SXin Li 890*67e74705SXin Li // dr81: na 891*67e74705SXin Li // dr82: dup 48 892*67e74705SXin Li 893*67e74705SXin Li namespace dr83 { // dr83: yes 894*67e74705SXin Li int &f(const char*); 895*67e74705SXin Li char &f(char *); 896*67e74705SXin Li int &k = f("foo"); 897*67e74705SXin Li } 898*67e74705SXin Li 899*67e74705SXin Li namespace dr84 { // dr84: yes 900*67e74705SXin Li struct B; 901*67e74705SXin Li struct A { operator B() const; }; 902*67e74705SXin Li struct C {}; 903*67e74705SXin Li struct B { 904*67e74705SXin Li B(B&); // expected-note {{candidate}} 905*67e74705SXin Li B(C); 906*67e74705SXin Li operator C() const; 907*67e74705SXin Li }; 908*67e74705SXin Li A a; 909*67e74705SXin Li // Cannot use B(C) / operator C() pair to construct the B from the B temporary 910*67e74705SXin Li // here. 911*67e74705SXin Li B b = a; // expected-error {{no viable}} 912*67e74705SXin Li } 913*67e74705SXin Li 914*67e74705SXin Li namespace dr85 { // dr85: yes 915*67e74705SXin Li struct A { 916*67e74705SXin Li struct B; 917*67e74705SXin Li struct B {}; // expected-note{{previous declaration is here}} 918*67e74705SXin Li struct B; // expected-error{{class member cannot be redeclared}} 919*67e74705SXin Li 920*67e74705SXin Li union U; 921*67e74705SXin Li union U {}; // expected-note{{previous declaration is here}} 922*67e74705SXin Li union U; // expected-error{{class member cannot be redeclared}} 923*67e74705SXin Li 924*67e74705SXin Li #if __cplusplus >= 201103L 925*67e74705SXin Li enum E1 : int; 926*67e74705SXin Li enum E1 : int { e1 }; // expected-note{{previous declaration is here}} 927*67e74705SXin Li enum E1 : int; // expected-error{{class member cannot be redeclared}} 928*67e74705SXin Li 929*67e74705SXin Li enum class E2; 930*67e74705SXin Li enum class E2 { e2 }; // expected-note{{previous declaration is here}} 931*67e74705SXin Li enum class E2; // expected-error{{class member cannot be redeclared}} 932*67e74705SXin Li #endif 933*67e74705SXin Li }; 934*67e74705SXin Li 935*67e74705SXin Li template <typename T> 936*67e74705SXin Li struct C { 937*67e74705SXin Li struct B {}; // expected-note{{previous declaration is here}} 938*67e74705SXin Li struct B; // expected-error{{class member cannot be redeclared}} 939*67e74705SXin Li }; 940*67e74705SXin Li } 941*67e74705SXin Li 942*67e74705SXin Li // dr86: dup 446 943*67e74705SXin Li 944*67e74705SXin Li namespace dr87 { // dr87: no 945*67e74705SXin Li template<typename T> struct X {}; 946*67e74705SXin Li // FIXME: This is invalid. 947*67e74705SXin Li X<void() throw()> x; 948*67e74705SXin Li // ... but this is valid. 949*67e74705SXin Li X<void(void() throw())> y; 950*67e74705SXin Li } 951*67e74705SXin Li 952*67e74705SXin Li namespace dr88 { // dr88: yes 953*67e74705SXin Li template<typename T> struct S { 954*67e74705SXin Li static const int a = 1; // expected-note {{previous}} 955*67e74705SXin Li static const int b; 956*67e74705SXin Li }; 957*67e74705SXin Li template<> const int S<int>::a = 4; // expected-error {{already has an initializer}} 958*67e74705SXin Li template<> const int S<int>::b = 4; 959*67e74705SXin Li } 960*67e74705SXin Li 961*67e74705SXin Li // dr89: na 962*67e74705SXin Li 963*67e74705SXin Li namespace dr90 { // dr90: yes 964*67e74705SXin Li struct A { 965*67e74705SXin Li template<typename T> friend void dr90_f(T); 966*67e74705SXin Li }; 967*67e74705SXin Li struct B : A { 968*67e74705SXin Li template<typename T> friend void dr90_g(T); 969*67e74705SXin Li struct C {}; 970*67e74705SXin Li union D {}; 971*67e74705SXin Li }; 972*67e74705SXin Li struct E : B {}; 973*67e74705SXin Li struct F : B::C {}; 974*67e74705SXin Li test()975*67e74705SXin Li void test() { 976*67e74705SXin Li dr90_f(A()); 977*67e74705SXin Li dr90_f(B()); 978*67e74705SXin Li dr90_f(B::C()); // expected-error {{undeclared identifier}} 979*67e74705SXin Li dr90_f(B::D()); // expected-error {{undeclared identifier}} 980*67e74705SXin Li dr90_f(E()); 981*67e74705SXin Li dr90_f(F()); // expected-error {{undeclared identifier}} 982*67e74705SXin Li 983*67e74705SXin Li dr90_g(A()); // expected-error {{undeclared identifier}} 984*67e74705SXin Li dr90_g(B()); 985*67e74705SXin Li dr90_g(B::C()); 986*67e74705SXin Li dr90_g(B::D()); 987*67e74705SXin Li dr90_g(E()); 988*67e74705SXin Li dr90_g(F()); // expected-error {{undeclared identifier}} 989*67e74705SXin Li } 990*67e74705SXin Li } 991*67e74705SXin Li 992*67e74705SXin Li namespace dr91 { // dr91: yes 993*67e74705SXin Li union U { friend int f(U); }; 994*67e74705SXin Li int k = f(U()); 995*67e74705SXin Li } 996*67e74705SXin Li 997*67e74705SXin Li namespace dr92 { // FIXME: Issue is still open. 998*67e74705SXin Li void f() throw(int, float); 999*67e74705SXin Li void (*p)() throw(int) = &f; // expected-error {{target exception specification is not superset of source}} 1000*67e74705SXin Li void (*q)() throw(int); 1001*67e74705SXin Li void (**pp)() throw() = &q; // expected-error {{exception specifications are not allowed}} 1002*67e74705SXin Li 1003*67e74705SXin Li void g(void() throw()); h()1004*67e74705SXin Li void h() { 1005*67e74705SXin Li g(f); // expected-error {{is not superset}} 1006*67e74705SXin Li g(q); // expected-error {{is not superset}} 1007*67e74705SXin Li } 1008*67e74705SXin Li 1009*67e74705SXin Li // Prior to C++17, this is OK because the exception specification is not 1010*67e74705SXin Li // considered in this context. In C++17, we *do* perform an implicit 1011*67e74705SXin Li // conversion (which performs initialization), but we convert to the type of 1012*67e74705SXin Li // the template parameter, which does not include the exception specification. 1013*67e74705SXin Li template<void() throw()> struct X {}; 1014*67e74705SXin Li X<&f> xp; // ok 1015*67e74705SXin Li } 1016*67e74705SXin Li 1017*67e74705SXin Li // dr93: na 1018*67e74705SXin Li 1019*67e74705SXin Li namespace dr94 { // dr94: yes 1020*67e74705SXin Li struct A { static const int n = 5; }; 1021*67e74705SXin Li int arr[A::n]; 1022*67e74705SXin Li } 1023*67e74705SXin Li 1024*67e74705SXin Li namespace dr95 { // dr95: yes 1025*67e74705SXin Li struct A; 1026*67e74705SXin Li struct B; 1027*67e74705SXin Li namespace N { 1028*67e74705SXin Li class C { 1029*67e74705SXin Li friend struct A; 1030*67e74705SXin Li friend struct B; 1031*67e74705SXin Li static void f(); // expected-note {{here}} 1032*67e74705SXin Li }; 1033*67e74705SXin Li struct A *p; // dr95::A, not dr95::N::A. 1034*67e74705SXin Li } 1035*67e74705SXin Li A *q = N::p; // ok, same type fdr95::B1036*67e74705SXin Li struct B { void f() { N::C::f(); } }; // expected-error {{private}} 1037*67e74705SXin Li } 1038*67e74705SXin Li 1039*67e74705SXin Li namespace dr96 { // dr96: no 1040*67e74705SXin Li struct A { 1041*67e74705SXin Li void f(int); 1042*67e74705SXin Li template<typename T> int f(T); 1043*67e74705SXin Li template<typename T> struct S {}; 1044*67e74705SXin Li } a; 1045*67e74705SXin Li template<template<typename> class X> struct B {}; 1046*67e74705SXin Li 1047*67e74705SXin Li template<typename T> test()1048*67e74705SXin Li void test() { 1049*67e74705SXin Li int k1 = a.template f<int>(0); 1050*67e74705SXin Li // FIXME: This is ill-formed, because 'f' is not a template-id and does not 1051*67e74705SXin Li // name a class template. 1052*67e74705SXin Li // FIXME: What about alias templates? 1053*67e74705SXin Li int k2 = a.template f(1); 1054*67e74705SXin Li A::template S<int> s; 1055*67e74705SXin Li B<A::template S> b; 1056*67e74705SXin Li } 1057*67e74705SXin Li } 1058*67e74705SXin Li 1059*67e74705SXin Li namespace dr97 { // dr97: yes 1060*67e74705SXin Li struct A { 1061*67e74705SXin Li static const int a = false; 1062*67e74705SXin Li static const int b = !a; 1063*67e74705SXin Li }; 1064*67e74705SXin Li } 1065*67e74705SXin Li 1066*67e74705SXin Li namespace dr98 { // dr98: yes test(int n)1067*67e74705SXin Li void test(int n) { 1068*67e74705SXin Li switch (n) { 1069*67e74705SXin Li try { // expected-note 2{{bypasses}} 1070*67e74705SXin Li case 0: // expected-error {{cannot jump}} 1071*67e74705SXin Li x: 1072*67e74705SXin Li throw n; 1073*67e74705SXin Li } catch (...) { // expected-note 2{{bypasses}} 1074*67e74705SXin Li case 1: // expected-error {{cannot jump}} 1075*67e74705SXin Li y: 1076*67e74705SXin Li throw n; 1077*67e74705SXin Li } 1078*67e74705SXin Li case 2: 1079*67e74705SXin Li goto x; // expected-error {{cannot jump}} 1080*67e74705SXin Li case 3: 1081*67e74705SXin Li goto y; // expected-error {{cannot jump}} 1082*67e74705SXin Li } 1083*67e74705SXin Li } 1084*67e74705SXin Li } 1085*67e74705SXin Li 1086*67e74705SXin Li namespace dr99 { // dr99: sup 214 1087*67e74705SXin Li template<typename T> void f(T&); 1088*67e74705SXin Li template<typename T> int &f(const T&); 1089*67e74705SXin Li const int n = 0; 1090*67e74705SXin Li int &r = f(n); 1091*67e74705SXin Li } 1092