1*67e74705SXin Li // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 2*67e74705SXin Li // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 3*67e74705SXin Li // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 4*67e74705SXin Li // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 5*67e74705SXin Li 6*67e74705SXin Li // FIXME: __SIZE_TYPE__ expands to 'long long' on some targets. 7*67e74705SXin Li __extension__ typedef __SIZE_TYPE__ size_t; 8*67e74705SXin Li 9*67e74705SXin Li namespace std { struct type_info; } 10*67e74705SXin Li 11*67e74705SXin Li namespace dr400 { // dr400: yes 12*67e74705SXin Li struct A { int a; struct a {}; }; // expected-note 2{{conflicting}} expected-note {{ambiguous}} 13*67e74705SXin Li struct B { int a; struct a {}; }; // expected-note 2{{target}} expected-note {{ambiguous}} 14*67e74705SXin Li struct C : A, B { using A::a; struct a b; }; 15*67e74705SXin Li struct D : A, B { using A::a; using B::a; struct a b; }; // expected-error 2{{conflicts}} 16*67e74705SXin Li struct E : A, B { struct a b; }; // expected-error {{found in multiple base classes}} 17*67e74705SXin Li } 18*67e74705SXin Li 19*67e74705SXin Li namespace dr401 { // dr401: yes 20*67e74705SXin Li template<class T, class U = typename T::type> class A : public T {}; // expected-error {{protected}} expected-error 2{{private}} 21*67e74705SXin Li 22*67e74705SXin Li class B { 23*67e74705SXin Li protected: 24*67e74705SXin Li typedef int type; // expected-note {{protected}} 25*67e74705SXin Li }; 26*67e74705SXin Li 27*67e74705SXin Li class C { 28*67e74705SXin Li typedef int type; // expected-note {{private}} 29*67e74705SXin Li friend class A<C>; // expected-note {{default argument}} 30*67e74705SXin Li }; 31*67e74705SXin Li 32*67e74705SXin Li class D { 33*67e74705SXin Li typedef int type; // expected-note {{private}} 34*67e74705SXin Li friend class A<D, int>; 35*67e74705SXin Li }; 36*67e74705SXin Li 37*67e74705SXin Li A<B> *b; // expected-note {{default argument}} 38*67e74705SXin Li // FIXME: We're missing the "in instantiation of" note for the default 39*67e74705SXin Li // argument here. 40*67e74705SXin Li A<D> *d; 41*67e74705SXin Li 42*67e74705SXin Li struct E { 43*67e74705SXin Li template<class T, class U = typename T::type> class A : public T {}; 44*67e74705SXin Li }; 45*67e74705SXin Li class F { 46*67e74705SXin Li typedef int type; 47*67e74705SXin Li friend class E; 48*67e74705SXin Li }; 49*67e74705SXin Li E::A<F> eaf; // ok, default argument is in befriended context 50*67e74705SXin Li 51*67e74705SXin Li // FIXME: Why do we get different diagnostics in C++11 onwards here? We seem 52*67e74705SXin Li // to not treat the default template argument as a SFINAE context in C++98. f(T)53*67e74705SXin Li template<class T, class U = typename T::type> void f(T) {} g(B b)54*67e74705SXin Li void g(B b) { f(b); } 55*67e74705SXin Li #if __cplusplus < 201103L 56*67e74705SXin Li // expected-error@-3 0-1{{extension}} expected-error@-3 {{protected}} expected-note@-3 {{instantiation}} 57*67e74705SXin Li // expected-note@-3 {{substituting}} 58*67e74705SXin Li #else 59*67e74705SXin Li // expected-error@-5 {{no matching}} expected-note@-6 {{protected}} 60*67e74705SXin Li #endif 61*67e74705SXin Li } 62*67e74705SXin Li 63*67e74705SXin Li namespace dr403 { // dr403: yes 64*67e74705SXin Li namespace A { 65*67e74705SXin Li struct S {}; 66*67e74705SXin Li int f(void*); 67*67e74705SXin Li } 68*67e74705SXin Li template<typename T> struct X {}; 69*67e74705SXin Li typedef struct X<A::S>::X XS; 70*67e74705SXin Li XS *p; 71*67e74705SXin Li int k = f(p); // ok, finds A::f, even though type XS is a typedef-name 72*67e74705SXin Li // referring to an elaborated-type-specifier naming a 73*67e74705SXin Li // injected-class-name, which is about as far from a 74*67e74705SXin Li // template-id as we can make it. 75*67e74705SXin Li } 76*67e74705SXin Li 77*67e74705SXin Li // dr404: na 78*67e74705SXin Li // (NB: also sup 594) 79*67e74705SXin Li 80*67e74705SXin Li namespace dr406 { // dr406: yes 81*67e74705SXin Li typedef struct { 82*67e74705SXin Li static int n; // expected-error {{static data member 'n' not allowed in anonymous struct}} 83*67e74705SXin Li } A; 84*67e74705SXin Li } 85*67e74705SXin Li 86*67e74705SXin Li namespace dr407 { // dr407: 3.8 87*67e74705SXin Li struct S; 88*67e74705SXin Li typedef struct S S; f()89*67e74705SXin Li void f() { 90*67e74705SXin Li struct S *p; 91*67e74705SXin Li { 92*67e74705SXin Li typedef struct S S; // expected-note {{here}} 93*67e74705SXin Li struct S *p; // expected-error {{refers to a typedef}} 94*67e74705SXin Li } 95*67e74705SXin Li } 96*67e74705SXin Li struct S {}; 97*67e74705SXin Li 98*67e74705SXin Li namespace UsingDir { 99*67e74705SXin Li namespace A { 100*67e74705SXin Li struct S {}; // expected-note {{found}} 101*67e74705SXin Li } 102*67e74705SXin Li namespace B { 103*67e74705SXin Li typedef int S; // expected-note {{found}} 104*67e74705SXin Li } 105*67e74705SXin Li namespace C { 106*67e74705SXin Li using namespace A; 107*67e74705SXin Li using namespace B; 108*67e74705SXin Li struct S s; // expected-error {{ambiguous}} 109*67e74705SXin Li } 110*67e74705SXin Li namespace D { 111*67e74705SXin Li using A::S; 112*67e74705SXin Li typedef struct S S; 113*67e74705SXin Li struct S s; 114*67e74705SXin Li } 115*67e74705SXin Li namespace E { 116*67e74705SXin Li // The standard doesn't say whether this is valid. We interpret 117*67e74705SXin Li // DR407 as meaning "if lookup finds both a tag and a typedef with the 118*67e74705SXin Li // same type, then it's OK in an elaborated-type-specifier". 119*67e74705SXin Li typedef A::S S; 120*67e74705SXin Li using A::S; 121*67e74705SXin Li struct S s; 122*67e74705SXin Li } 123*67e74705SXin Li namespace F { 124*67e74705SXin Li typedef A::S S; 125*67e74705SXin Li } 126*67e74705SXin Li // The standard doesn't say what to do in these cases either. 127*67e74705SXin Li namespace G { 128*67e74705SXin Li using namespace A; 129*67e74705SXin Li using namespace F; 130*67e74705SXin Li struct S s; 131*67e74705SXin Li } 132*67e74705SXin Li namespace H { 133*67e74705SXin Li using namespace F; 134*67e74705SXin Li using namespace A; 135*67e74705SXin Li struct S s; 136*67e74705SXin Li } 137*67e74705SXin Li } 138*67e74705SXin Li } 139*67e74705SXin Li 140*67e74705SXin Li namespace dr408 { // dr408: 3.4 g()141*67e74705SXin Li template<int N> void g() { int arr[N != 1 ? 1 : -1]; } g()142*67e74705SXin Li template<> void g<2>() { } 143*67e74705SXin Li 144*67e74705SXin Li template<typename T> struct S { 145*67e74705SXin Li static int i[]; 146*67e74705SXin Li void f(); 147*67e74705SXin Li }; 148*67e74705SXin Li template<typename T> int S<T>::i[] = { 1 }; 149*67e74705SXin Li f()150*67e74705SXin Li template<typename T> void S<T>::f() { 151*67e74705SXin Li g<sizeof (i) / sizeof (int)>(); 152*67e74705SXin Li } 153*67e74705SXin Li template<> int S<int>::i[] = { 1, 2 }; 154*67e74705SXin Li template void S<int>::f(); // uses g<2>(), not g<1>(). 155*67e74705SXin Li 156*67e74705SXin Li 157*67e74705SXin Li template<typename T> struct R { 158*67e74705SXin Li static int arr[]; 159*67e74705SXin Li void f(); 160*67e74705SXin Li }; 161*67e74705SXin Li template<typename T> int R<T>::arr[1]; f()162*67e74705SXin Li template<typename T> void R<T>::f() { 163*67e74705SXin Li int arr[sizeof(arr) != sizeof(int) ? 1 : -1]; 164*67e74705SXin Li } 165*67e74705SXin Li template<> int R<int>::arr[2]; 166*67e74705SXin Li template void R<int>::f(); 167*67e74705SXin Li } 168*67e74705SXin Li 169*67e74705SXin Li namespace dr409 { // dr409: yes 170*67e74705SXin Li template<typename T> struct A { 171*67e74705SXin Li typedef int B; 172*67e74705SXin Li B b1; 173*67e74705SXin Li A::B b2; 174*67e74705SXin Li A<T>::B b3; 175*67e74705SXin Li A<T*>::B b4; // expected-error {{missing 'typename'}} 176*67e74705SXin Li }; 177*67e74705SXin Li } 178*67e74705SXin Li 179*67e74705SXin Li namespace dr410 { // dr410: no 180*67e74705SXin Li template<class T> void f(T); 181*67e74705SXin Li void g(int); 182*67e74705SXin Li namespace M { 183*67e74705SXin Li template<class T> void h(T); 184*67e74705SXin Li template<class T> void i(T); 185*67e74705SXin Li struct A { 186*67e74705SXin Li friend void f<>(int); 187*67e74705SXin Li friend void h<>(int); 188*67e74705SXin Li friend void g(int); 189*67e74705SXin Li template<class T> void i(T); 190*67e74705SXin Li friend void i<>(int); 191*67e74705SXin Li private: 192*67e74705SXin Li static void z(); // expected-note {{private}} 193*67e74705SXin Li }; 194*67e74705SXin Li h(int)195*67e74705SXin Li template<> void h(int) { A::z(); } 196*67e74705SXin Li // FIXME: This should be ill-formed. The member A::i<> is befriended, 197*67e74705SXin Li // not this function. i(int)198*67e74705SXin Li template<> void i(int) { A::z(); } 199*67e74705SXin Li } f(int)200*67e74705SXin Li template<> void f(int) { M::A::z(); } g(int)201*67e74705SXin Li void g(int) { M::A::z(); } // expected-error {{private}} 202*67e74705SXin Li } 203*67e74705SXin Li 204*67e74705SXin Li // dr412 is in its own file. 205*67e74705SXin Li 206*67e74705SXin Li namespace dr413 { // dr413: yes 207*67e74705SXin Li struct S { 208*67e74705SXin Li int a; 209*67e74705SXin Li int : 17; 210*67e74705SXin Li int b; 211*67e74705SXin Li }; 212*67e74705SXin Li S s = { 1, 2, 3 }; // expected-error {{excess elements}} 213*67e74705SXin Li 214*67e74705SXin Li struct E {}; 215*67e74705SXin Li struct T { // expected-note {{here}} 216*67e74705SXin Li int a; 217*67e74705SXin Li E e; 218*67e74705SXin Li int b; 219*67e74705SXin Li }; 220*67e74705SXin Li T t1 = { 1, {}, 2 }; 221*67e74705SXin Li T t2 = { 1, 2 }; // expected-error {{aggregate with no elements requires explicit braces}} 222*67e74705SXin Li } 223*67e74705SXin Li 224*67e74705SXin Li namespace dr414 { // dr414: dup 305 225*67e74705SXin Li struct X {}; f()226*67e74705SXin Li void f() { 227*67e74705SXin Li X x; 228*67e74705SXin Li struct X {}; 229*67e74705SXin Li x.~X(); 230*67e74705SXin Li } 231*67e74705SXin Li } 232*67e74705SXin Li 233*67e74705SXin Li namespace dr415 { // dr415: yes f(T,...)234*67e74705SXin Li template<typename T> void f(T, ...) { T::error; } 235*67e74705SXin Li void f(int, int); g()236*67e74705SXin Li void g() { f(0, 0); } // ok 237*67e74705SXin Li } 238*67e74705SXin Li 239*67e74705SXin Li namespace dr416 { // dr416: yes 240*67e74705SXin Li extern struct A a; 241*67e74705SXin Li int &operator+(const A&, const A&); 242*67e74705SXin Li int &k = a + a; 243*67e74705SXin Li struct A { float &operator+(A&); }; 244*67e74705SXin Li float &f = a + a; 245*67e74705SXin Li } 246*67e74705SXin Li 247*67e74705SXin Li namespace dr417 { // dr417: no 248*67e74705SXin Li struct A; 249*67e74705SXin Li struct dr417::A {}; // expected-warning {{extra qualification}} 250*67e74705SXin Li struct B { struct X; }; 251*67e74705SXin Li struct C : B {}; 252*67e74705SXin Li struct C::X {}; // expected-error {{no struct named 'X' in 'dr417::C'}} 253*67e74705SXin Li struct B::X { struct Y; }; 254*67e74705SXin Li struct C::X::Y {}; // ok! 255*67e74705SXin Li namespace N { 256*67e74705SXin Li struct D; 257*67e74705SXin Li struct E; 258*67e74705SXin Li struct F; 259*67e74705SXin Li struct H; 260*67e74705SXin Li } 261*67e74705SXin Li // FIXME: This is ill-formed. 262*67e74705SXin Li using N::D; 263*67e74705SXin Li struct dr417::D {}; // expected-warning {{extra qualification}} 264*67e74705SXin Li using namespace N; 265*67e74705SXin Li struct dr417::E {}; // expected-warning {{extra qualification}} expected-error {{no struct named 'E'}} 266*67e74705SXin Li struct N::F {}; 267*67e74705SXin Li struct G; 268*67e74705SXin Li using N::H; 269*67e74705SXin Li namespace M { 270*67e74705SXin Li struct dr417::G {}; // expected-error {{namespace 'M' does not enclose}} 271*67e74705SXin Li struct dr417::H {}; // expected-error {{namespace 'M' does not enclose}} 272*67e74705SXin Li } 273*67e74705SXin Li } 274*67e74705SXin Li 275*67e74705SXin Li namespace dr420 { // dr420: yes 276*67e74705SXin Li template<typename T> struct ptr { 277*67e74705SXin Li T *operator->() const; 278*67e74705SXin Li T &operator*() const; 279*67e74705SXin Li }; test(P p)280*67e74705SXin Li template<typename T, typename P> void test(P p) { 281*67e74705SXin Li p->~T(); 282*67e74705SXin Li p->T::~T(); 283*67e74705SXin Li (*p).~T(); 284*67e74705SXin Li (*p).T::~T(); 285*67e74705SXin Li } 286*67e74705SXin Li struct X {}; 287*67e74705SXin Li template void test<int>(int*); 288*67e74705SXin Li template void test<int>(ptr<int>); 289*67e74705SXin Li template void test<X>(X*); 290*67e74705SXin Li template void test<X>(ptr<X>); 291*67e74705SXin Li 292*67e74705SXin Li template<typename T> test2(T p)293*67e74705SXin Li void test2(T p) { 294*67e74705SXin Li p->template Y<int>::~Y<int>(); 295*67e74705SXin Li p->~Y<int>(); 296*67e74705SXin Li // FIXME: This is ill-formed, but this diagnostic is terrible. We should 297*67e74705SXin Li // reject this in the parser. 298*67e74705SXin Li p->template ~Y<int>(); // expected-error 2{{no member named '~typename Y<int>'}} 299*67e74705SXin Li } 300*67e74705SXin Li template<typename T> struct Y {}; 301*67e74705SXin Li template void test2(Y<int>*); // expected-note {{instantiation}} 302*67e74705SXin Li template void test2(ptr<Y<int> >); // expected-note {{instantiation}} 303*67e74705SXin Li test3(int * p,ptr<int> q)304*67e74705SXin Li void test3(int *p, ptr<int> q) { 305*67e74705SXin Li typedef int Int; 306*67e74705SXin Li p->~Int(); 307*67e74705SXin Li q->~Int(); 308*67e74705SXin Li p->Int::~Int(); 309*67e74705SXin Li q->Int::~Int(); 310*67e74705SXin Li } 311*67e74705SXin Li 312*67e74705SXin Li #if __cplusplus >= 201103L 313*67e74705SXin Li template<typename T> using id = T; 314*67e74705SXin Li struct A { template<typename T> using id = T; }; test4(int * p,ptr<int> q)315*67e74705SXin Li void test4(int *p, ptr<int> q) { 316*67e74705SXin Li p->~id<int>(); 317*67e74705SXin Li q->~id<int>(); 318*67e74705SXin Li p->id<int>::~id<int>(); 319*67e74705SXin Li q->id<int>::~id<int>(); 320*67e74705SXin Li p->template id<int>::~id<int>(); // expected-error {{expected unqualified-id}} 321*67e74705SXin Li q->template id<int>::~id<int>(); // expected-error {{expected unqualified-id}} 322*67e74705SXin Li p->A::template id<int>::~id<int>(); 323*67e74705SXin Li q->A::template id<int>::~id<int>(); 324*67e74705SXin Li } 325*67e74705SXin Li #endif 326*67e74705SXin Li } 327*67e74705SXin Li 328*67e74705SXin Li namespace dr421 { // dr421: yes 329*67e74705SXin Li struct X { X(); int n; int &r; }; 330*67e74705SXin Li int *p = &X().n; // expected-error {{taking the address of a temporary}} 331*67e74705SXin Li int *q = &X().r; 332*67e74705SXin Li } 333*67e74705SXin Li 334*67e74705SXin Li namespace dr422 { // dr422: yes f()335*67e74705SXin Li template<typename T, typename U> void f() { 336*67e74705SXin Li typedef T type; // expected-note {{prev}} 337*67e74705SXin Li typedef U type; // expected-error {{redef}} 338*67e74705SXin Li } 339*67e74705SXin Li template void f<int, int>(); 340*67e74705SXin Li template void f<int, char>(); // expected-note {{instantiation}} 341*67e74705SXin Li } 342*67e74705SXin Li 343*67e74705SXin Li namespace dr423 { // dr423: yes 344*67e74705SXin Li template<typename T> struct X { operator T&(); }; f(X<int> x)345*67e74705SXin Li void f(X<int> x) { x += 1; } 346*67e74705SXin Li } 347*67e74705SXin Li 348*67e74705SXin Li namespace dr424 { // dr424: yes 349*67e74705SXin Li struct A { 350*67e74705SXin Li typedef int N; // expected-note {{previous}} 351*67e74705SXin Li typedef int N; // expected-error {{redefinition}} 352*67e74705SXin Li 353*67e74705SXin Li struct X; 354*67e74705SXin Li typedef X X; // expected-note {{previous}} 355*67e74705SXin Li struct X {}; 356*67e74705SXin Li 357*67e74705SXin Li struct X *p; 358*67e74705SXin Li struct A::X *q; 359*67e74705SXin Li X *r; 360*67e74705SXin Li 361*67e74705SXin Li typedef X X; // expected-error {{redefinition}} 362*67e74705SXin Li }; 363*67e74705SXin Li struct B { 364*67e74705SXin Li typedef int N; 365*67e74705SXin Li }; 366*67e74705SXin Li struct C : B { 367*67e74705SXin Li typedef int N; // expected-note {{previous}} 368*67e74705SXin Li typedef int N; // expected-error {{redefinition}} 369*67e74705SXin Li }; 370*67e74705SXin Li } 371*67e74705SXin Li 372*67e74705SXin Li namespace dr425 { // dr425: yes 373*67e74705SXin Li struct A { template<typename T> operator T() const; } a; 374*67e74705SXin Li float f = 1.0f * a; // expected-error {{ambiguous}} expected-note 5+{{built-in candidate}} 375*67e74705SXin Li 376*67e74705SXin Li template<typename T> struct is_float; 377*67e74705SXin Li template<> struct is_float<float> { typedef void type; }; 378*67e74705SXin Li 379*67e74705SXin Li struct B { 380*67e74705SXin Li template<typename T, typename U = typename is_float<T>::type> operator T() const; // expected-error 0-1{{extension}} 381*67e74705SXin Li } b; 382*67e74705SXin Li float g = 1.0f * b; // ok 383*67e74705SXin Li } 384*67e74705SXin Li 385*67e74705SXin Li namespace dr427 { // dr427: yes 386*67e74705SXin Li struct B {}; 387*67e74705SXin Li struct D : public B { 388*67e74705SXin Li D(B &) = delete; // expected-error 0-1{{extension}} expected-note {{deleted}} 389*67e74705SXin Li }; 390*67e74705SXin Li 391*67e74705SXin Li extern D d1; 392*67e74705SXin Li B &b = d1; 393*67e74705SXin Li const D &d2 = static_cast<const D&>(b); 394*67e74705SXin Li const D &d3 = (const D&)b; 395*67e74705SXin Li const D &d4(b); // expected-error {{deleted}} 396*67e74705SXin Li } 397*67e74705SXin Li 398*67e74705SXin Li namespace dr428 { // dr428: yes 399*67e74705SXin Li template<typename T> T make(); 400*67e74705SXin Li extern struct X x; // expected-note 5{{forward declaration}} f()401*67e74705SXin Li void f() { 402*67e74705SXin Li throw void(); // expected-error {{cannot throw}} 403*67e74705SXin Li throw make<void*>(); 404*67e74705SXin Li throw make<const volatile void*>(); 405*67e74705SXin Li throw x; // expected-error {{cannot throw}} 406*67e74705SXin Li throw make<X&>(); // expected-error {{cannot throw}} 407*67e74705SXin Li throw make<X*>(); // expected-error {{cannot throw}} 408*67e74705SXin Li throw make<const volatile X&>(); // expected-error {{cannot throw}} 409*67e74705SXin Li throw make<const volatile X*>(); // expected-error {{cannot throw}} 410*67e74705SXin Li } 411*67e74705SXin Li } 412*67e74705SXin Li 413*67e74705SXin Li namespace dr429 { // dr429: yes c++11 414*67e74705SXin Li // FIXME: This rule is obviously intended to apply to C++98 as well. 415*67e74705SXin Li struct A { 416*67e74705SXin Li static void *operator new(size_t, size_t); 417*67e74705SXin Li static void operator delete(void*, size_t); 418*67e74705SXin Li } *a = new (0) A; 419*67e74705SXin Li #if __cplusplus >= 201103L 420*67e74705SXin Li // expected-error@-2 {{'new' expression with placement arguments refers to non-placement 'operator delete'}} 421*67e74705SXin Li // expected-note@-4 {{here}} 422*67e74705SXin Li #endif 423*67e74705SXin Li struct B { 424*67e74705SXin Li static void *operator new(size_t, size_t); 425*67e74705SXin Li static void operator delete(void*); 426*67e74705SXin Li static void operator delete(void*, size_t); 427*67e74705SXin Li } *b = new (0) B; // ok, second delete is not a non-placement deallocation function 428*67e74705SXin Li } 429*67e74705SXin Li 430*67e74705SXin Li namespace dr430 { // dr430: yes c++11 431*67e74705SXin Li // resolved by n2239 432*67e74705SXin Li // FIXME: This should apply in C++98 too. f(int n)433*67e74705SXin Li void f(int n) { 434*67e74705SXin Li int a[] = { n++, n++, n++ }; 435*67e74705SXin Li #if __cplusplus < 201103L 436*67e74705SXin Li // expected-warning@-2 {{multiple unsequenced modifications to 'n'}} 437*67e74705SXin Li #endif 438*67e74705SXin Li } 439*67e74705SXin Li } 440*67e74705SXin Li 441*67e74705SXin Li namespace dr431 { // dr431: yes 442*67e74705SXin Li struct A { 443*67e74705SXin Li template<typename T> T *get(); 444*67e74705SXin Li template<typename T> struct B { 445*67e74705SXin Li template<typename U> U *get(); 446*67e74705SXin Li }; 447*67e74705SXin Li }; 448*67e74705SXin Li f(A a)449*67e74705SXin Li template<typename T> void f(A a) { 450*67e74705SXin Li a.get<A>()->get<T>(); 451*67e74705SXin Li a.get<T>() 452*67e74705SXin Li ->get<T>(); // expected-error {{use 'template'}} 453*67e74705SXin Li a.get<T>()->template get<T>(); 454*67e74705SXin Li a.A::get<T>(); 455*67e74705SXin Li A::B<int> *b = a.get<A::B<int> >(); 456*67e74705SXin Li b->get<int>(); 457*67e74705SXin Li b->A::B<int>::get<int>(); 458*67e74705SXin Li b->A::B<int>::get<T>(); 459*67e74705SXin Li b->A::B<T>::get<int>(); // expected-error {{use 'template'}} 460*67e74705SXin Li b->A::B<T>::template get<int>(); 461*67e74705SXin Li b->A::B<T>::get<T>(); // expected-error {{use 'template'}} 462*67e74705SXin Li b->A::B<T>::template get<T>(); 463*67e74705SXin Li A::B<T> *c = a.get<A::B<T> >(); 464*67e74705SXin Li c->get<int>(); // expected-error {{use 'template'}} 465*67e74705SXin Li c->template get<int>(); 466*67e74705SXin Li } 467*67e74705SXin Li } 468*67e74705SXin Li 469*67e74705SXin Li namespace dr432 { // dr432: yes 470*67e74705SXin Li template<typename T> struct A {}; 471*67e74705SXin Li template<typename T> struct B : A<B> {}; // expected-error {{requires template arguments}} expected-note {{declared}} 472*67e74705SXin Li template<typename T> struct C : A<C<T> > {}; 473*67e74705SXin Li #if __cplusplus >= 201103L 474*67e74705SXin Li template<typename T> struct D : decltype(A<D>()) {}; // expected-error {{requires template arguments}} expected-note {{declared}} 475*67e74705SXin Li #endif 476*67e74705SXin Li } 477*67e74705SXin Li 478*67e74705SXin Li namespace dr433 { // dr433: yes 479*67e74705SXin Li template<class T> struct S { 480*67e74705SXin Li void f(union U*); 481*67e74705SXin Li }; 482*67e74705SXin Li U *p; f(union U *)483*67e74705SXin Li template<class T> void S<T>::f(union U*) {} 484*67e74705SXin Li 485*67e74705SXin Li S<int> s; 486*67e74705SXin Li } 487*67e74705SXin Li 488*67e74705SXin Li namespace dr434 { // dr434: yes f()489*67e74705SXin Li void f() { 490*67e74705SXin Li const int ci = 0; 491*67e74705SXin Li int *pi = 0; 492*67e74705SXin Li const int *&rpci = pi; // expected-error {{cannot bind}} 493*67e74705SXin Li rpci = &ci; 494*67e74705SXin Li *pi = 1; 495*67e74705SXin Li } 496*67e74705SXin Li } 497*67e74705SXin Li 498*67e74705SXin Li // dr435: na 499*67e74705SXin Li 500*67e74705SXin Li namespace dr436 { // dr436: yes 501*67e74705SXin Li enum E { f }; // expected-note {{previous}} 502*67e74705SXin Li void f(); // expected-error {{redefinition}} 503*67e74705SXin Li } 504*67e74705SXin Li 505*67e74705SXin Li namespace dr437 { // dr437: sup 1308 506*67e74705SXin Li // This is superseded by 1308, which is in turn superseded by 1330, 507*67e74705SXin Li // which restores this rule. 508*67e74705SXin Li template<typename U> struct T : U {}; 509*67e74705SXin Li struct S { 510*67e74705SXin Li void f() throw(S); 511*67e74705SXin Li void g() throw(T<S>); 512*67e74705SXin Li struct U; 513*67e74705SXin Li void h() throw(U); 514*67e74705SXin Li struct U {}; 515*67e74705SXin Li }; 516*67e74705SXin Li } 517*67e74705SXin Li 518*67e74705SXin Li // dr438 FIXME write a codegen test 519*67e74705SXin Li // dr439 FIXME write a codegen test 520*67e74705SXin Li // dr441 FIXME write a codegen test 521*67e74705SXin Li // dr442: sup 348 522*67e74705SXin Li // dr443: na 523*67e74705SXin Li 524*67e74705SXin Li namespace dr444 { // dr444: yes 525*67e74705SXin Li struct D; 526*67e74705SXin Li struct B { // expected-note {{candidate is the implicit copy}} expected-note 0-1 {{implicit move}} 527*67e74705SXin Li D &operator=(D &) = delete; // expected-error 0-1{{extension}} expected-note {{deleted}} 528*67e74705SXin Li }; 529*67e74705SXin Li struct D : B { // expected-note {{candidate is the implicit}} expected-note 0-1 {{implicit move}} 530*67e74705SXin Li using B::operator=; 531*67e74705SXin Li } extern d; f()532*67e74705SXin Li void f() { 533*67e74705SXin Li d = d; // expected-error {{deleted}} 534*67e74705SXin Li } 535*67e74705SXin Li } 536*67e74705SXin Li 537*67e74705SXin Li namespace dr445 { // dr445: yes 538*67e74705SXin Li class A { void f(); }; // expected-note {{private}} 539*67e74705SXin Li struct B { 540*67e74705SXin Li friend void A::f(); // expected-error {{private}} 541*67e74705SXin Li }; 542*67e74705SXin Li } 543*67e74705SXin Li 544*67e74705SXin Li namespace dr446 { // dr446: yes 545*67e74705SXin Li struct C; 546*67e74705SXin Li struct A { 547*67e74705SXin Li A(); 548*67e74705SXin Li A(const A&) = delete; // expected-error 0-1{{extension}} expected-note +{{deleted}} 549*67e74705SXin Li A(const C&); 550*67e74705SXin Li }; 551*67e74705SXin Li struct C : A {}; f(A a,bool b,C c)552*67e74705SXin Li void f(A a, bool b, C c) { 553*67e74705SXin Li void(b ? a : a); 554*67e74705SXin Li b ? A() : a; // expected-error {{deleted}} 555*67e74705SXin Li b ? a : A(); // expected-error {{deleted}} 556*67e74705SXin Li b ? A() : A(); // expected-error {{deleted}} 557*67e74705SXin Li 558*67e74705SXin Li void(b ? a : c); 559*67e74705SXin Li b ? a : C(); // expected-error {{deleted}} 560*67e74705SXin Li b ? c : A(); // expected-error {{deleted}} 561*67e74705SXin Li b ? A() : C(); // expected-error {{deleted}} 562*67e74705SXin Li } 563*67e74705SXin Li } 564*67e74705SXin Li 565*67e74705SXin Li namespace dr447 { // dr447: yes 566*67e74705SXin Li struct A { int n; int a[4]; }; 567*67e74705SXin Li template<int> struct U { 568*67e74705SXin Li typedef int type; 569*67e74705SXin Li template<typename V> static void h(); 570*67e74705SXin Li }; 571*67e74705SXin Li template<typename T> U<sizeof(T)> g(T); f(int n)572*67e74705SXin Li template<typename T, int N> void f(int n) { 573*67e74705SXin Li // ok, not type dependent 574*67e74705SXin Li g(__builtin_offsetof(A, n)).h<int>(); 575*67e74705SXin Li g(__builtin_offsetof(T, n)).h<int>(); 576*67e74705SXin Li // value dependent if first argument is a dependent type 577*67e74705SXin Li U<__builtin_offsetof(A, n)>::type a; 578*67e74705SXin Li U<__builtin_offsetof(T, n)>::type b; // expected-error +{{}} expected-warning 0+{{}} 579*67e74705SXin Li // as an extension, we allow the member-designator to include array indices 580*67e74705SXin Li g(__builtin_offsetof(A, a[0])).h<int>(); // expected-error {{extension}} 581*67e74705SXin Li g(__builtin_offsetof(A, a[N])).h<int>(); // expected-error {{extension}} 582*67e74705SXin Li U<__builtin_offsetof(A, a[0])>::type c; // expected-error {{extension}} 583*67e74705SXin Li U<__builtin_offsetof(A, a[N])>::type d; // expected-error {{extension}} expected-error +{{}} expected-warning 0+{{}} 584*67e74705SXin Li } 585*67e74705SXin Li } 586*67e74705SXin Li 587*67e74705SXin Li namespace dr448 { // dr448: yes 588*67e74705SXin Li template<typename T = int> void f(int); // expected-error 0-1{{extension}} expected-note {{no known conversion}} g(T t)589*67e74705SXin Li template<typename T> void g(T t) { 590*67e74705SXin Li f<T>(t); // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}} 591*67e74705SXin Li dr448::f(t); // expected-error {{no matching function}} 592*67e74705SXin Li } 593*67e74705SXin Li template<typename T> void f(T); // expected-note {{should be declared prior to the call site}} 594*67e74705SXin Li namespace HideFromADL { struct X {}; } 595*67e74705SXin Li template void g(int); // ok 596*67e74705SXin Li template void g(HideFromADL::X); // expected-note {{instantiation of}} 597*67e74705SXin Li } 598*67e74705SXin Li 599*67e74705SXin Li // dr449: na 600*67e74705SXin Li 601*67e74705SXin Li namespace dr450 { // dr450: yes 602*67e74705SXin Li typedef int A[3]; 603*67e74705SXin Li void f1(const A &); 604*67e74705SXin Li void f2(A &); // expected-note +{{not viable}} 605*67e74705SXin Li struct S { A n; }; g()606*67e74705SXin Li void g() { 607*67e74705SXin Li f1(S().n); 608*67e74705SXin Li f2(S().n); // expected-error {{no match}}} 609*67e74705SXin Li } 610*67e74705SXin Li #if __cplusplus >= 201103L h()611*67e74705SXin Li void h() { 612*67e74705SXin Li f1(A{}); 613*67e74705SXin Li f2(A{}); // expected-error {{no match}} 614*67e74705SXin Li } 615*67e74705SXin Li #endif 616*67e74705SXin Li } 617*67e74705SXin Li 618*67e74705SXin Li namespace dr451 { // dr451: yes 619*67e74705SXin Li const int a = 1 / 0; // expected-warning {{undefined}} 620*67e74705SXin Li const int b = 1 / 0; // expected-warning {{undefined}} 621*67e74705SXin Li int arr[b]; // expected-error +{{variable length arr}} 622*67e74705SXin Li } 623*67e74705SXin Li 624*67e74705SXin Li namespace dr452 { // dr452: yes 625*67e74705SXin Li struct A { 626*67e74705SXin Li int a, b, c; 627*67e74705SXin Li A *p; 628*67e74705SXin Li int f(); Adr452::A629*67e74705SXin Li A() : a(f()), b(this->f() + a), c(this->a), p(this) {} 630*67e74705SXin Li }; 631*67e74705SXin Li } 632*67e74705SXin Li 633*67e74705SXin Li // dr454 FIXME write a codegen test 634*67e74705SXin Li 635*67e74705SXin Li namespace dr456 { // dr456: yes 636*67e74705SXin Li // sup 903 c++11 637*67e74705SXin Li const int null = 0; 638*67e74705SXin Li void *p = null; 639*67e74705SXin Li #if __cplusplus >= 201103L 640*67e74705SXin Li // expected-error@-2 {{cannot initialize}} 641*67e74705SXin Li #else 642*67e74705SXin Li // expected-warning@-4 {{null}} 643*67e74705SXin Li #endif 644*67e74705SXin Li 645*67e74705SXin Li const bool f = false; 646*67e74705SXin Li void *q = f; 647*67e74705SXin Li #if __cplusplus >= 201103L 648*67e74705SXin Li // expected-error@-2 {{cannot initialize}} 649*67e74705SXin Li #else 650*67e74705SXin Li // expected-warning@-4 {{null}} 651*67e74705SXin Li #endif 652*67e74705SXin Li } 653*67e74705SXin Li 654*67e74705SXin Li namespace dr457 { // dr457: yes 655*67e74705SXin Li const int a = 1; 656*67e74705SXin Li const volatile int b = 1; 657*67e74705SXin Li int ax[a]; 658*67e74705SXin Li int bx[b]; // expected-error +{{variable length array}} 659*67e74705SXin Li 660*67e74705SXin Li enum E { 661*67e74705SXin Li ea = a, 662*67e74705SXin Li eb = b // expected-error {{constant}} expected-note {{read of volatile-qualified}} 663*67e74705SXin Li }; 664*67e74705SXin Li } 665*67e74705SXin Li 666*67e74705SXin Li namespace dr458 { // dr458: no 667*67e74705SXin Li struct A { 668*67e74705SXin Li int T; 669*67e74705SXin Li int f(); 670*67e74705SXin Li template<typename> int g(); 671*67e74705SXin Li }; 672*67e74705SXin Li 673*67e74705SXin Li template<typename> struct B : A { 674*67e74705SXin Li int f(); 675*67e74705SXin Li template<typename> int g(); 676*67e74705SXin Li template<typename> int h(); 677*67e74705SXin Li }; 678*67e74705SXin Li f()679*67e74705SXin Li int A::f() { 680*67e74705SXin Li return T; 681*67e74705SXin Li } 682*67e74705SXin Li template<typename T> g()683*67e74705SXin Li int A::g() { 684*67e74705SXin Li return T; // FIXME: this is invalid, it finds the template parameter 685*67e74705SXin Li } 686*67e74705SXin Li 687*67e74705SXin Li template<typename T> f()688*67e74705SXin Li int B<T>::f() { 689*67e74705SXin Li return T; 690*67e74705SXin Li } 691*67e74705SXin Li template<typename T> template<typename U> g()692*67e74705SXin Li int B<T>::g() { 693*67e74705SXin Li return T; 694*67e74705SXin Li } 695*67e74705SXin Li template<typename U> template<typename T> h()696*67e74705SXin Li int B<U>::h() { 697*67e74705SXin Li return T; // FIXME: this is invalid, it finds the template parameter 698*67e74705SXin Li } 699*67e74705SXin Li } 700*67e74705SXin Li 701*67e74705SXin Li namespace dr460 { // dr460: yes 702*67e74705SXin Li namespace X { namespace Q { int n; } } 703*67e74705SXin Li namespace Y { 704*67e74705SXin Li using X; // expected-error {{requires a qualified name}} 705*67e74705SXin Li using dr460::X; // expected-error {{cannot refer to a namespace}} 706*67e74705SXin Li using X::Q; // expected-error {{cannot refer to a namespace}} 707*67e74705SXin Li } 708*67e74705SXin Li } 709*67e74705SXin Li 710*67e74705SXin Li // dr461: na 711*67e74705SXin Li // dr462 FIXME write a codegen test 712*67e74705SXin Li // dr463: na 713*67e74705SXin Li // dr464: na 714*67e74705SXin Li // dr465: na 715*67e74705SXin Li 716*67e74705SXin Li namespace dr466 { // dr466: no 717*67e74705SXin Li typedef int I; 718*67e74705SXin Li typedef const int CI; 719*67e74705SXin Li typedef volatile int VI; f(int * a,CI * b,VI * c)720*67e74705SXin Li void f(int *a, CI *b, VI *c) { 721*67e74705SXin Li a->~I(); 722*67e74705SXin Li a->~CI(); 723*67e74705SXin Li a->~VI(); 724*67e74705SXin Li a->I::~I(); 725*67e74705SXin Li a->CI::~CI(); 726*67e74705SXin Li a->VI::~VI(); 727*67e74705SXin Li 728*67e74705SXin Li a->CI::~VI(); // FIXME: This is invalid; CI and VI are not the same scalar type. 729*67e74705SXin Li 730*67e74705SXin Li b->~I(); 731*67e74705SXin Li b->~CI(); 732*67e74705SXin Li b->~VI(); 733*67e74705SXin Li b->I::~I(); 734*67e74705SXin Li b->CI::~CI(); 735*67e74705SXin Li b->VI::~VI(); 736*67e74705SXin Li 737*67e74705SXin Li c->~I(); 738*67e74705SXin Li c->~CI(); 739*67e74705SXin Li c->~VI(); 740*67e74705SXin Li c->I::~I(); 741*67e74705SXin Li c->CI::~CI(); 742*67e74705SXin Li c->VI::~VI(); 743*67e74705SXin Li } 744*67e74705SXin Li } 745*67e74705SXin Li 746*67e74705SXin Li namespace dr467 { // dr467: yes 747*67e74705SXin Li int stuff(); 748*67e74705SXin Li f()749*67e74705SXin Li int f() { 750*67e74705SXin Li static bool done; 751*67e74705SXin Li if (done) 752*67e74705SXin Li goto later; 753*67e74705SXin Li static int k = stuff(); 754*67e74705SXin Li done = true; 755*67e74705SXin Li later: 756*67e74705SXin Li return k; 757*67e74705SXin Li } g()758*67e74705SXin Li int g() { 759*67e74705SXin Li goto later; // expected-error {{cannot jump}} 760*67e74705SXin Li int k = stuff(); // expected-note {{bypasses variable initialization}} 761*67e74705SXin Li later: 762*67e74705SXin Li return k; 763*67e74705SXin Li } 764*67e74705SXin Li } 765*67e74705SXin Li 766*67e74705SXin Li namespace dr468 { // dr468: yes c++11 767*67e74705SXin Li // FIXME: Should we allow this in C++98 too? 768*67e74705SXin Li template<typename> struct A { 769*67e74705SXin Li template<typename> struct B { 770*67e74705SXin Li static int C; 771*67e74705SXin Li }; 772*67e74705SXin Li }; 773*67e74705SXin Li int k = dr468::template A<int>::template B<char>::C; 774*67e74705SXin Li #if __cplusplus < 201103L 775*67e74705SXin Li // expected-error@-2 2{{'template' keyword outside of a template}} 776*67e74705SXin Li #endif 777*67e74705SXin Li } 778*67e74705SXin Li 779*67e74705SXin Li namespace dr469 { // dr469: no 780*67e74705SXin Li // FIXME: The core issue here didn't really answer the question. We don't 781*67e74705SXin Li // deduce 'const T' from a function or reference type in a class template... 782*67e74705SXin Li template<typename T> struct X; // expected-note 2{{here}} 783*67e74705SXin Li template<typename T> struct X<const T> {}; 784*67e74705SXin Li X<int&> x; // expected-error {{undefined}} 785*67e74705SXin Li X<int()> y; // expected-error {{undefined}} 786*67e74705SXin Li 787*67e74705SXin Li // ... but we do in a function template. GCC and EDG fail deduction of 'f' 788*67e74705SXin Li // and the second 'h'. 789*67e74705SXin Li template<typename T> void f(const T *); 790*67e74705SXin Li template<typename T> void g(T *, const T * = 0); h(T *)791*67e74705SXin Li template<typename T> void h(T *) { T::error; } 792*67e74705SXin Li template<typename T> void h(const T *); i()793*67e74705SXin Li void i() { 794*67e74705SXin Li f(&i); 795*67e74705SXin Li g(&i); 796*67e74705SXin Li h(&i); 797*67e74705SXin Li } 798*67e74705SXin Li } 799*67e74705SXin Li 800*67e74705SXin Li namespace dr470 { // dr470: yes 801*67e74705SXin Li template<typename T> struct A { 802*67e74705SXin Li struct B {}; 803*67e74705SXin Li }; 804*67e74705SXin Li template<typename T> struct C { 805*67e74705SXin Li }; 806*67e74705SXin Li 807*67e74705SXin Li template struct A<int>; // expected-note {{previous}} 808*67e74705SXin Li template struct A<int>::B; // expected-error {{duplicate explicit instantiation}} 809*67e74705SXin Li 810*67e74705SXin Li // ok, instantiating C<char> doesn't instantiate base class members. 811*67e74705SXin Li template struct A<char>; 812*67e74705SXin Li template struct C<char>; 813*67e74705SXin Li } 814*67e74705SXin Li 815*67e74705SXin Li namespace dr471 { // dr471: yes 816*67e74705SXin Li struct A { int n; }; 817*67e74705SXin Li struct B : private virtual A {}; 818*67e74705SXin Li struct C : protected virtual A {}; fdr471::D819*67e74705SXin Li struct D : B, C { int f() { return n; } }; 820*67e74705SXin Li struct E : private virtual A { 821*67e74705SXin Li using A::n; 822*67e74705SXin Li }; fdr471::F823*67e74705SXin Li struct F : E, B { int f() { return n; } }; 824*67e74705SXin Li struct G : virtual A { 825*67e74705SXin Li private: 826*67e74705SXin Li using A::n; // expected-note {{here}} 827*67e74705SXin Li }; fdr471::H828*67e74705SXin Li struct H : B, G { int f() { return n; } }; // expected-error {{private}} 829*67e74705SXin Li } 830*67e74705SXin Li 831*67e74705SXin Li namespace dr474 { // dr474: yes 832*67e74705SXin Li namespace N { 833*67e74705SXin Li struct S { 834*67e74705SXin Li void f(); 835*67e74705SXin Li }; 836*67e74705SXin Li } f()837*67e74705SXin Li void N::S::f() { 838*67e74705SXin Li void g(); // expected-note {{previous}} 839*67e74705SXin Li } 840*67e74705SXin Li int g(); 841*67e74705SXin Li namespace N { 842*67e74705SXin Li int g(); // expected-error {{cannot be overloaded}} 843*67e74705SXin Li } 844*67e74705SXin Li } 845*67e74705SXin Li 846*67e74705SXin Li // dr475 FIXME write a codegen test 847*67e74705SXin Li 848*67e74705SXin Li namespace dr477 { // dr477: 3.5 849*67e74705SXin Li struct A { 850*67e74705SXin Li explicit A(); 851*67e74705SXin Li virtual void f(); 852*67e74705SXin Li }; 853*67e74705SXin Li struct B { 854*67e74705SXin Li friend explicit A::A(); // expected-error {{'explicit' is invalid in friend declarations}} 855*67e74705SXin Li friend virtual void A::f(); // expected-error {{'virtual' is invalid in friend declarations}} 856*67e74705SXin Li }; A()857*67e74705SXin Li explicit A::A() {} // expected-error {{can only be specified inside the class definition}} f()858*67e74705SXin Li virtual void A::f() {} // expected-error {{can only be specified inside the class definition}} 859*67e74705SXin Li } 860*67e74705SXin Li 861*67e74705SXin Li namespace dr478 { // dr478: yes 862*67e74705SXin Li struct A { virtual void f() = 0; }; // expected-note {{unimplemented}} 863*67e74705SXin Li void f(A *a); 864*67e74705SXin Li void f(A a[10]); // expected-error {{array of abstract class type}} 865*67e74705SXin Li } 866*67e74705SXin Li 867*67e74705SXin Li namespace dr479 { // dr479: yes 868*67e74705SXin Li struct S { 869*67e74705SXin Li S(); 870*67e74705SXin Li private: 871*67e74705SXin Li S(const S&); // expected-note +{{here}} 872*67e74705SXin Li ~S(); // expected-note +{{here}} 873*67e74705SXin Li }; f()874*67e74705SXin Li void f() { 875*67e74705SXin Li throw S(); 876*67e74705SXin Li // expected-error@-1 {{temporary of type 'dr479::S' has private destructor}} 877*67e74705SXin Li // expected-error@-2 {{calling a private constructor}} 878*67e74705SXin Li // expected-error@-3 {{exception object of type 'dr479::S' has private destructor}} 879*67e74705SXin Li #if __cplusplus < 201103L 880*67e74705SXin Li // expected-error@-5 {{C++98 requires an accessible copy constructor}} 881*67e74705SXin Li #endif 882*67e74705SXin Li } g()883*67e74705SXin Li void g() { 884*67e74705SXin Li S s; // expected-error {{private destructor}}} 885*67e74705SXin Li throw s; 886*67e74705SXin Li // expected-error@-1 {{calling a private constructor}} 887*67e74705SXin Li // expected-error@-2 {{exception object of type 'dr479::S' has private destructor}} 888*67e74705SXin Li } h()889*67e74705SXin Li void h() { 890*67e74705SXin Li try { 891*67e74705SXin Li f(); 892*67e74705SXin Li g(); 893*67e74705SXin Li } catch (S s) { 894*67e74705SXin Li // expected-error@-1 {{calling a private constructor}} 895*67e74705SXin Li // expected-error@-2 {{variable of type 'dr479::S' has private destructor}} 896*67e74705SXin Li } 897*67e74705SXin Li } 898*67e74705SXin Li } 899*67e74705SXin Li 900*67e74705SXin Li namespace dr480 { // dr480: yes 901*67e74705SXin Li struct A { int n; }; 902*67e74705SXin Li struct B : A {}; 903*67e74705SXin Li struct C : virtual B {}; 904*67e74705SXin Li struct D : C {}; 905*67e74705SXin Li 906*67e74705SXin Li int A::*a = &A::n; 907*67e74705SXin Li int D::*b = a; // expected-error {{virtual base}} 908*67e74705SXin Li 909*67e74705SXin Li extern int D::*c; 910*67e74705SXin Li int A::*d = static_cast<int A::*>(c); // expected-error {{virtual base}} 911*67e74705SXin Li 912*67e74705SXin Li D *e; 913*67e74705SXin Li A *f = e; 914*67e74705SXin Li D *g = static_cast<D*>(f); // expected-error {{virtual base}} 915*67e74705SXin Li 916*67e74705SXin Li extern D &i; 917*67e74705SXin Li A &j = i; 918*67e74705SXin Li D &k = static_cast<D&>(j); // expected-error {{virtual base}} 919*67e74705SXin Li } 920*67e74705SXin Li 921*67e74705SXin Li namespace dr481 { // dr481: yes 922*67e74705SXin Li template<class T, T U> class A { T *x; }; 923*67e74705SXin Li T *x; // expected-error {{unknown type}} 924*67e74705SXin Li 925*67e74705SXin Li template<class T *U> class B { T *x; }; 926*67e74705SXin Li T *y; // ok 927*67e74705SXin Li 928*67e74705SXin Li struct C { 929*67e74705SXin Li template<class T> void f(class D *p); 930*67e74705SXin Li }; 931*67e74705SXin Li D *z; // ok 932*67e74705SXin Li 933*67e74705SXin Li template<typename A = C, typename C = A> struct E { fdr481::E934*67e74705SXin Li void f() { 935*67e74705SXin Li typedef ::dr481::C c; // expected-note {{previous}} 936*67e74705SXin Li typedef C c; // expected-error {{different type}} 937*67e74705SXin Li } 938*67e74705SXin Li }; 939*67e74705SXin Li template struct E<>; // ok 940*67e74705SXin Li template struct E<int>; // expected-note {{instantiation of}} 941*67e74705SXin Li 942*67e74705SXin Li template<template<typename U_no_typo_correction> class A, 943*67e74705SXin Li A<int> *B, 944*67e74705SXin Li U_no_typo_correction *C> // expected-error {{unknown type}} 945*67e74705SXin Li struct F { 946*67e74705SXin Li U_no_typo_correction *x; // expected-error {{unknown type}} 947*67e74705SXin Li }; 948*67e74705SXin Li 949*67e74705SXin Li template<template<class H *> class> struct G { 950*67e74705SXin Li H *x; 951*67e74705SXin Li }; 952*67e74705SXin Li H *q; 953*67e74705SXin Li 954*67e74705SXin Li typedef int N; 955*67e74705SXin Li template<N X, typename N, template<N Y> class T> struct I; 956*67e74705SXin Li template<char*> struct J; 957*67e74705SXin Li I<123, char*, J> *j; 958*67e74705SXin Li } 959*67e74705SXin Li 960*67e74705SXin Li namespace dr482 { // dr482: 3.5 961*67e74705SXin Li extern int a; 962*67e74705SXin Li void f(); 963*67e74705SXin Li 964*67e74705SXin Li int dr482::a = 0; // expected-warning {{extra qualification}} f()965*67e74705SXin Li void dr482::f() {} // expected-warning {{extra qualification}} 966*67e74705SXin Li 967*67e74705SXin Li inline namespace X { // expected-error 0-1{{C++11 feature}} 968*67e74705SXin Li extern int b; 969*67e74705SXin Li void g(); 970*67e74705SXin Li struct S; 971*67e74705SXin Li } 972*67e74705SXin Li int dr482::b = 0; // expected-warning {{extra qualification}} g()973*67e74705SXin Li void dr482::g() {} // expected-warning {{extra qualification}} 974*67e74705SXin Li struct dr482::S {}; // expected-warning {{extra qualification}} 975*67e74705SXin Li 976*67e74705SXin Li void dr482::f(); // expected-warning {{extra qualification}} 977*67e74705SXin Li void dr482::g(); // expected-warning {{extra qualification}} 978*67e74705SXin Li 979*67e74705SXin Li // FIXME: The following are valid in DR482's wording, but these are bugs in 980*67e74705SXin Li // the wording which we deliberately don't implement. 981*67e74705SXin Li namespace N { typedef int type; } 982*67e74705SXin Li typedef int N::type; // expected-error {{typedef declarator cannot be qualified}} 983*67e74705SXin Li struct A { 984*67e74705SXin Li struct B; 985*67e74705SXin Li struct A::B {}; // expected-error {{extra qualification}} 986*67e74705SXin Li 987*67e74705SXin Li #if __cplusplus >= 201103L 988*67e74705SXin Li enum class C; 989*67e74705SXin Li enum class A::C {}; // expected-error {{extra qualification}} 990*67e74705SXin Li #endif 991*67e74705SXin Li }; 992*67e74705SXin Li } 993*67e74705SXin Li 994*67e74705SXin Li namespace dr483 { // dr483: yes 995*67e74705SXin Li namespace climits { 996*67e74705SXin Li int check1[__SCHAR_MAX__ >= 127 ? 1 : -1]; 997*67e74705SXin Li int check2[__SHRT_MAX__ >= 32767 ? 1 : -1]; 998*67e74705SXin Li int check3[__INT_MAX__ >= 32767 ? 1 : -1]; 999*67e74705SXin Li int check4[__LONG_MAX__ >= 2147483647 ? 1 : -1]; 1000*67e74705SXin Li int check5[__LONG_LONG_MAX__ >= 9223372036854775807 ? 1 : -1]; 1001*67e74705SXin Li #if __cplusplus < 201103L 1002*67e74705SXin Li // expected-error@-2 {{extension}} 1003*67e74705SXin Li #endif 1004*67e74705SXin Li } 1005*67e74705SXin Li namespace cstdint { 1006*67e74705SXin Li int check1[__PTRDIFF_WIDTH__ >= 16 ? 1 : -1]; 1007*67e74705SXin Li int check2[__SIG_ATOMIC_WIDTH__ >= 8 ? 1 : -1]; 1008*67e74705SXin Li int check3[__SIZE_WIDTH__ >= 16 ? 1 : -1]; 1009*67e74705SXin Li int check4[__WCHAR_WIDTH__ >= 8 ? 1 : -1]; 1010*67e74705SXin Li int check5[__WINT_WIDTH__ >= 16 ? 1 : -1]; 1011*67e74705SXin Li } 1012*67e74705SXin Li } 1013*67e74705SXin Li 1014*67e74705SXin Li namespace dr484 { // dr484: yes 1015*67e74705SXin Li struct A { 1016*67e74705SXin Li A(); 1017*67e74705SXin Li void f(); 1018*67e74705SXin Li }; 1019*67e74705SXin Li typedef const A CA; f()1020*67e74705SXin Li void CA::f() { 1021*67e74705SXin Li this->~CA(); 1022*67e74705SXin Li this->CA::~A(); 1023*67e74705SXin Li this->CA::A::~A(); 1024*67e74705SXin Li } A()1025*67e74705SXin Li CA::A() {} 1026*67e74705SXin Li 1027*67e74705SXin Li struct B : CA { Bdr484::B1028*67e74705SXin Li B() : CA() {} fdr484::B1029*67e74705SXin Li void f() { return CA::f(); } 1030*67e74705SXin Li }; 1031*67e74705SXin Li 1032*67e74705SXin Li struct C; 1033*67e74705SXin Li typedef C CT; // expected-note {{here}} 1034*67e74705SXin Li struct CT {}; // expected-error {{conflicts with typedef}} 1035*67e74705SXin Li 1036*67e74705SXin Li namespace N { 1037*67e74705SXin Li struct D; 1038*67e74705SXin Li typedef D DT; // expected-note {{here}} 1039*67e74705SXin Li } 1040*67e74705SXin Li struct N::DT {}; // expected-error {{conflicts with typedef}} 1041*67e74705SXin Li 1042*67e74705SXin Li typedef struct { 1043*67e74705SXin Li S(); // expected-error {{requires a type}} 1044*67e74705SXin Li } S; 1045*67e74705SXin Li } 1046*67e74705SXin Li 1047*67e74705SXin Li namespace dr485 { // dr485: yes 1048*67e74705SXin Li namespace N { 1049*67e74705SXin Li struct S {}; 1050*67e74705SXin Li int operator+(S, S); 1051*67e74705SXin Li template<typename T> int f(S); 1052*67e74705SXin Li } 1053*67e74705SXin Li template<typename T> int f(); 1054*67e74705SXin Li 1055*67e74705SXin Li N::S s; 1056*67e74705SXin Li int a = operator+(s, s); 1057*67e74705SXin Li int b = f<int>(s); 1058*67e74705SXin Li } 1059*67e74705SXin Li 1060*67e74705SXin Li namespace dr486 { // dr486: yes 1061*67e74705SXin Li template<typename T> T f(T *); // expected-note 2{{substitution failure}} 1062*67e74705SXin Li int &f(...); 1063*67e74705SXin Li 1064*67e74705SXin Li void g(); 1065*67e74705SXin Li int n[10]; 1066*67e74705SXin Li h()1067*67e74705SXin Li void h() { 1068*67e74705SXin Li int &a = f(&g); 1069*67e74705SXin Li int &b = f(&n); 1070*67e74705SXin Li f<void()>(&g); // expected-error {{no match}} 1071*67e74705SXin Li f<int[10]>(&n); // expected-error {{no match}} 1072*67e74705SXin Li } 1073*67e74705SXin Li } 1074*67e74705SXin Li 1075*67e74705SXin Li namespace dr487 { // dr487: yes 1076*67e74705SXin Li enum E { e }; 1077*67e74705SXin Li int operator+(int, E); 1078*67e74705SXin Li int i[4 + e]; // expected-error 2{{variable length array}} 1079*67e74705SXin Li } 1080*67e74705SXin Li 1081*67e74705SXin Li namespace dr488 { // dr488: yes c++11 1082*67e74705SXin Li template <typename T> void f(T); 1083*67e74705SXin Li void f(int); g()1084*67e74705SXin Li void g() { 1085*67e74705SXin Li // FIXME: It seems CWG thought this should be a SFINAE failure prior to 1086*67e74705SXin Li // allowing local types as template arguments. In C++98, we should either 1087*67e74705SXin Li // allow local types as template arguments or treat this as a SFINAE 1088*67e74705SXin Li // failure. 1089*67e74705SXin Li enum E { e }; 1090*67e74705SXin Li f(e); 1091*67e74705SXin Li #if __cplusplus < 201103L 1092*67e74705SXin Li // expected-error@-2 {{local type}} 1093*67e74705SXin Li #endif 1094*67e74705SXin Li } 1095*67e74705SXin Li } 1096*67e74705SXin Li 1097*67e74705SXin Li // dr489: na 1098*67e74705SXin Li 1099*67e74705SXin Li namespace dr490 { // dr490: yes 1100*67e74705SXin Li template<typename T> struct X {}; 1101*67e74705SXin Li 1102*67e74705SXin Li struct A { 1103*67e74705SXin Li typedef int T; 1104*67e74705SXin Li struct K {}; // expected-note {{declared}} 1105*67e74705SXin Li 1106*67e74705SXin Li int f(T); 1107*67e74705SXin Li int g(T); 1108*67e74705SXin Li int h(X<T>); 1109*67e74705SXin Li int X<T>::*i(); // expected-note {{previous}} 1110*67e74705SXin Li int K::*j(); 1111*67e74705SXin Li 1112*67e74705SXin Li template<typename T> T k(); 1113*67e74705SXin Li 1114*67e74705SXin Li operator X<T>(); 1115*67e74705SXin Li }; 1116*67e74705SXin Li 1117*67e74705SXin Li struct B { 1118*67e74705SXin Li typedef char T; 1119*67e74705SXin Li typedef int U; 1120*67e74705SXin Li friend int A::f(T); 1121*67e74705SXin Li friend int A::g(U); 1122*67e74705SXin Li friend int A::h(X<T>); 1123*67e74705SXin Li 1124*67e74705SXin Li // FIXME: Per this DR, these two are valid! That is another defect 1125*67e74705SXin Li // (no number yet...) which will eventually supersede this one. 1126*67e74705SXin Li friend int X<T>::*A::i(); // expected-error {{return type}} 1127*67e74705SXin Li friend int K::*A::j(); // expected-error {{undeclared identifier 'K'; did you mean 'A::K'?}} 1128*67e74705SXin Li 1129*67e74705SXin Li // ok, lookup finds B::T, not A::T, so return type matches 1130*67e74705SXin Li friend char A::k<T>(); 1131*67e74705SXin Li friend int A::k<U>(); 1132*67e74705SXin Li 1133*67e74705SXin Li // A conversion-type-id in a conversion-function-id is always looked up in 1134*67e74705SXin Li // the class of the conversion function first. 1135*67e74705SXin Li friend A::operator X<T>(); 1136*67e74705SXin Li }; 1137*67e74705SXin Li } 1138*67e74705SXin Li 1139*67e74705SXin Li namespace dr491 { // dr491: dup 413 1140*67e74705SXin Li struct A {} a, b[3] = { a, {} }; 1141*67e74705SXin Li A c[2] = { a, {}, b[1] }; // expected-error {{excess elements}} 1142*67e74705SXin Li } 1143*67e74705SXin Li 1144*67e74705SXin Li // dr492 FIXME write a codegen test 1145*67e74705SXin Li 1146*67e74705SXin Li namespace dr493 { // dr493: dup 976 1147*67e74705SXin Li struct X { 1148*67e74705SXin Li template <class T> operator const T &() const; 1149*67e74705SXin Li }; f()1150*67e74705SXin Li void f() { 1151*67e74705SXin Li if (X()) { 1152*67e74705SXin Li } 1153*67e74705SXin Li } 1154*67e74705SXin Li } 1155*67e74705SXin Li 1156*67e74705SXin Li namespace dr494 { // dr494: dup 372 1157*67e74705SXin Li class A { 1158*67e74705SXin Li class B {}; 1159*67e74705SXin Li friend class C; 1160*67e74705SXin Li }; 1161*67e74705SXin Li class C : A::B { 1162*67e74705SXin Li A::B x; 1163*67e74705SXin Li class D : A::B { 1164*67e74705SXin Li A::B y; 1165*67e74705SXin Li }; 1166*67e74705SXin Li }; 1167*67e74705SXin Li } 1168*67e74705SXin Li 1169*67e74705SXin Li namespace dr495 { // dr495: 3.5 1170*67e74705SXin Li template<typename T> 1171*67e74705SXin Li struct S { operator intdr495::S1172*67e74705SXin Li operator int() { return T::error; } 1173*67e74705SXin Li template<typename U> operator U(); 1174*67e74705SXin Li }; 1175*67e74705SXin Li S<int> s; 1176*67e74705SXin Li long n = s; 1177*67e74705SXin Li 1178*67e74705SXin Li template<typename T> 1179*67e74705SXin Li struct S2 { 1180*67e74705SXin Li template<typename U> operator U(); operator intdr495::S21181*67e74705SXin Li operator int() { return T::error; } 1182*67e74705SXin Li }; 1183*67e74705SXin Li S2<int> s2; 1184*67e74705SXin Li long n2 = s2; 1185*67e74705SXin Li } 1186*67e74705SXin Li 1187*67e74705SXin Li namespace dr496 { // dr496: no 1188*67e74705SXin Li struct A { int n; }; 1189*67e74705SXin Li struct B { volatile int n; }; 1190*67e74705SXin Li int check1[ __is_trivially_copyable(const int) ? 1 : -1]; 1191*67e74705SXin Li int check2[!__is_trivially_copyable(volatile int) ? 1 : -1]; 1192*67e74705SXin Li int check3[ __is_trivially_constructible(A, const A&) ? 1 : -1]; 1193*67e74705SXin Li // FIXME: This is wrong. 1194*67e74705SXin Li int check4[ __is_trivially_constructible(B, const B&) ? 1 : -1]; 1195*67e74705SXin Li int check5[ __is_trivially_assignable(A, const A&) ? 1 : -1]; 1196*67e74705SXin Li // FIXME: This is wrong. 1197*67e74705SXin Li int check6[ __is_trivially_assignable(B, const B&) ? 1 : -1]; 1198*67e74705SXin Li } 1199*67e74705SXin Li 1200*67e74705SXin Li namespace dr497 { // dr497: sup 253 before()1201*67e74705SXin Li void before() { 1202*67e74705SXin Li struct S { 1203*67e74705SXin Li mutable int i; 1204*67e74705SXin Li }; 1205*67e74705SXin Li const S cs; 1206*67e74705SXin Li int S::*pm = &S::i; 1207*67e74705SXin Li cs.*pm = 88; // expected-error {{not assignable}} 1208*67e74705SXin Li } 1209*67e74705SXin Li after()1210*67e74705SXin Li void after() { 1211*67e74705SXin Li struct S { 1212*67e74705SXin Li S() : i(0) {} 1213*67e74705SXin Li mutable int i; 1214*67e74705SXin Li }; 1215*67e74705SXin Li const S cs; 1216*67e74705SXin Li int S::*pm = &S::i; 1217*67e74705SXin Li cs.*pm = 88; // expected-error {{not assignable}} 1218*67e74705SXin Li } 1219*67e74705SXin Li } 1220*67e74705SXin Li 1221*67e74705SXin Li namespace dr499 { // dr499: yes 1222*67e74705SXin Li extern char str[]; f()1223*67e74705SXin Li void f() { throw str; } 1224*67e74705SXin Li } 1225