19aa0d394SBenjamin Kramer // RUN: %clang_cc1 -fsyntax-only -verify %s 2*64a1a81eSCharles Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s 3*64a1a81eSCharles Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 4a009726cSJohn McCall 5a009726cSJohn McCall // This is just the test for [namespace.udecl]p4 with 'using' 6a009726cSJohn McCall // uniformly stripped out. 7a009726cSJohn McCall 8a009726cSJohn McCall // C++03 [namespace.udecl]p4: 9a009726cSJohn McCall // A using-declaration used as a member-declaration shall refer to a 10a009726cSJohn McCall // member of a base class of the class being defined, shall refer to 11a009726cSJohn McCall // a member of an anonymous union that is a member of a base class 12a009726cSJohn McCall // of the class being defined, or shall refer to an enumerator for 13a009726cSJohn McCall // an enumeration type that is a member of a base class of the class 14a009726cSJohn McCall // being defined. 15a009726cSJohn McCall 16a009726cSJohn McCall // There is no directly analogous paragraph in C++0x, and the feature 17a009726cSJohn McCall // works sufficiently differently there that it needs a separate test. 18a009726cSJohn McCall 19a009726cSJohn McCall namespace test0 { 20a009726cSJohn McCall namespace NonClass { 21a009726cSJohn McCall typedef int type; 22a009726cSJohn McCall struct hiding {}; 23a009726cSJohn McCall int hiding; 24a009726cSJohn McCall static union { double union_member; }; 25a009726cSJohn McCall enum tagname { enumerator }; 26a009726cSJohn McCall } 27a009726cSJohn McCall 28a009726cSJohn McCall class Test0 { 29*64a1a81eSCharles Li NonClass::type; // expected-error {{not a class}} 30*64a1a81eSCharles Li #if __cplusplus <= 199711L 31*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 32*64a1a81eSCharles Li #else 33*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 34*64a1a81eSCharles Li #endif 35*64a1a81eSCharles Li 36*64a1a81eSCharles Li NonClass::hiding; // expected-error {{not a class}} 37*64a1a81eSCharles Li #if __cplusplus <= 199711L 38*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 39*64a1a81eSCharles Li #else 40*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 41*64a1a81eSCharles Li #endif 42*64a1a81eSCharles Li 43*64a1a81eSCharles Li NonClass::union_member; // expected-error {{not a class}} 44*64a1a81eSCharles Li #if __cplusplus <= 199711L 45*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 46*64a1a81eSCharles Li #else 47*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 48*64a1a81eSCharles Li #endif 49*64a1a81eSCharles Li 50*64a1a81eSCharles Li NonClass::enumerator; // expected-error {{not a class}} 51*64a1a81eSCharles Li #if __cplusplus <= 199711L 52*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 53*64a1a81eSCharles Li #else 54*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 55*64a1a81eSCharles Li #endif 56a009726cSJohn McCall }; 57a009726cSJohn McCall } 58a009726cSJohn McCall 59a009726cSJohn McCall struct Opaque0 {}; 60a009726cSJohn McCall 61a009726cSJohn McCall namespace test1 { 62a009726cSJohn McCall struct A { 63a009726cSJohn McCall typedef int type; 64a009726cSJohn McCall struct hiding {}; // expected-note {{previous use is here}} 65a009726cSJohn McCall Opaque0 hiding; 66a009726cSJohn McCall union { double union_member; }; 67a009726cSJohn McCall enum tagname { enumerator }; 68a009726cSJohn McCall }; 69a009726cSJohn McCall 70a009726cSJohn McCall struct B : A { 71*64a1a81eSCharles Li A::type; 72*64a1a81eSCharles Li #if __cplusplus <= 199711L 73*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 74*64a1a81eSCharles Li #else 75*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 76*64a1a81eSCharles Li #endif 77*64a1a81eSCharles Li A::hiding; 78*64a1a81eSCharles Li #if __cplusplus <= 199711L 79*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 80*64a1a81eSCharles Li #else 81*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 82*64a1a81eSCharles Li #endif 83*64a1a81eSCharles Li 84*64a1a81eSCharles Li A::union_member; 85*64a1a81eSCharles Li #if __cplusplus <= 199711L 86*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 87*64a1a81eSCharles Li #else 88*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 89*64a1a81eSCharles Li #endif 90*64a1a81eSCharles Li 91*64a1a81eSCharles Li A::enumerator; 92*64a1a81eSCharles Li #if __cplusplus <= 199711L 93*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 94*64a1a81eSCharles Li #else 95*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 96*64a1a81eSCharles Li #endif 97*64a1a81eSCharles Li 98*64a1a81eSCharles Li A::tagname; 99*64a1a81eSCharles Li #if __cplusplus <= 199711L 100*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 101*64a1a81eSCharles Li #else 102*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 103*64a1a81eSCharles Li #endif 104a009726cSJohn McCall test0test1::B105a009726cSJohn McCall void test0() { 106a009726cSJohn McCall type t = 0; 107a009726cSJohn McCall } 108a009726cSJohn McCall test1test1::B109a009726cSJohn McCall void test1() { 110a009726cSJohn McCall typedef struct A::hiding local; 111a009726cSJohn McCall struct hiding _ = local(); 112a009726cSJohn McCall } 113a009726cSJohn McCall test2test1::B114a009726cSJohn McCall void test2() { 115a009726cSJohn McCall union hiding _; // expected-error {{tag type that does not match previous}} 116a009726cSJohn McCall } 117a009726cSJohn McCall test3test1::B118a009726cSJohn McCall void test3() { 119a009726cSJohn McCall char array[sizeof(union_member) == sizeof(double) ? 1 : -1]; 120a009726cSJohn McCall } 121a009726cSJohn McCall test4test1::B122a009726cSJohn McCall void test4() { 123a009726cSJohn McCall enum tagname _ = enumerator; 124a009726cSJohn McCall } 125a009726cSJohn McCall test5test1::B126a009726cSJohn McCall void test5() { 127a009726cSJohn McCall Opaque0 _ = hiding; 128a009726cSJohn McCall } 129a009726cSJohn McCall }; 130a009726cSJohn McCall } 131a009726cSJohn McCall 132a009726cSJohn McCall namespace test2 { 133a009726cSJohn McCall struct A { 134a009726cSJohn McCall typedef int type; 135a009726cSJohn McCall struct hiding {}; // expected-note {{previous use is here}} 136a009726cSJohn McCall int hiding; 137a009726cSJohn McCall union { double union_member; }; 138a009726cSJohn McCall enum tagname { enumerator }; 139a009726cSJohn McCall }; 140a009726cSJohn McCall 141a009726cSJohn McCall template <class T> struct B : A { 142*64a1a81eSCharles Li A::type; 143*64a1a81eSCharles Li #if __cplusplus <= 199711L 144*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 145*64a1a81eSCharles Li #else 146*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 147*64a1a81eSCharles Li #endif 148*64a1a81eSCharles Li 149*64a1a81eSCharles Li A::hiding; 150*64a1a81eSCharles Li #if __cplusplus <= 199711L 151*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 152*64a1a81eSCharles Li #else 153*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 154*64a1a81eSCharles Li #endif 155*64a1a81eSCharles Li 156*64a1a81eSCharles Li A::union_member; 157*64a1a81eSCharles Li #if __cplusplus <= 199711L 158*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 159*64a1a81eSCharles Li #else 160*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 161*64a1a81eSCharles Li #endif 162*64a1a81eSCharles Li 163*64a1a81eSCharles Li A::enumerator; 164*64a1a81eSCharles Li #if __cplusplus <= 199711L 165*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 166*64a1a81eSCharles Li #else 167*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 168*64a1a81eSCharles Li #endif 169*64a1a81eSCharles Li 170*64a1a81eSCharles Li A::tagname; 171*64a1a81eSCharles Li #if __cplusplus <= 199711L 172*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 173*64a1a81eSCharles Li #else 174*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 175*64a1a81eSCharles Li #endif 176a009726cSJohn McCall test0test2::B177a009726cSJohn McCall void test0() { 178a009726cSJohn McCall type t = 0; 179a009726cSJohn McCall } 180a009726cSJohn McCall test1test2::B181a009726cSJohn McCall void test1() { 182a009726cSJohn McCall typedef struct A::hiding local; 183a009726cSJohn McCall struct hiding _ = local(); 184a009726cSJohn McCall } 185a009726cSJohn McCall test2test2::B186a009726cSJohn McCall void test2() { 187a009726cSJohn McCall union hiding _; // expected-error {{tag type that does not match previous}} 188a009726cSJohn McCall } 189a009726cSJohn McCall test3test2::B190a009726cSJohn McCall void test3() { 191a009726cSJohn McCall char array[sizeof(union_member) == sizeof(double) ? 1 : -1]; 192a009726cSJohn McCall } 193a009726cSJohn McCall test4test2::B194a009726cSJohn McCall void test4() { 195a009726cSJohn McCall enum tagname _ = enumerator; 196a009726cSJohn McCall } 197a009726cSJohn McCall test5test2::B198a009726cSJohn McCall void test5() { 199a009726cSJohn McCall Opaque0 _ = hiding; 200a009726cSJohn McCall } 201a009726cSJohn McCall }; 202a009726cSJohn McCall } 203a009726cSJohn McCall 204a009726cSJohn McCall namespace test3 { 205a009726cSJohn McCall struct hiding {}; 206a009726cSJohn McCall 207a009726cSJohn McCall template <class T> struct A { 208a009726cSJohn McCall typedef int type; // expected-note {{target of using declaration}} 209a009726cSJohn McCall struct hiding {}; 210a009726cSJohn McCall Opaque0 hiding; 211a009726cSJohn McCall union { double union_member; }; 212a009726cSJohn McCall enum tagname { enumerator }; // expected-note {{target of using declaration}} 213a009726cSJohn McCall }; 214a009726cSJohn McCall 215a009726cSJohn McCall template <class T> struct B : A<T> { 216*64a1a81eSCharles Li A<T>::type; // expected-error {{dependent using declaration resolved to type without 'typename'}} 217*64a1a81eSCharles Li #if __cplusplus <= 199711L 218*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 219*64a1a81eSCharles Li #else 220*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 221*64a1a81eSCharles Li #endif 222*64a1a81eSCharles Li 223*64a1a81eSCharles Li A<T>::hiding; 224*64a1a81eSCharles Li #if __cplusplus <= 199711L 225*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 226*64a1a81eSCharles Li #else 227*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 228*64a1a81eSCharles Li #endif 229*64a1a81eSCharles Li 230*64a1a81eSCharles Li A<T>::union_member; 231*64a1a81eSCharles Li #if __cplusplus <= 199711L 232*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 233*64a1a81eSCharles Li #else 234*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 235*64a1a81eSCharles Li #endif 236*64a1a81eSCharles Li 237*64a1a81eSCharles Li A<T>::enumerator; 238*64a1a81eSCharles Li #if __cplusplus <= 199711L 239*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 240*64a1a81eSCharles Li #else 241*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 242*64a1a81eSCharles Li #endif 243*64a1a81eSCharles Li 244*64a1a81eSCharles Li A<T>::tagname; // expected-error {{dependent using declaration resolved to type without 'typename'}} 245*64a1a81eSCharles Li #if __cplusplus <= 199711L 246*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 247*64a1a81eSCharles Li #else 248*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 249*64a1a81eSCharles Li #endif 250a009726cSJohn McCall 251a009726cSJohn McCall // FIXME: re-enable these when the various bugs involving tags are fixed 252a009726cSJohn McCall #if 0 253a009726cSJohn McCall void test1() { 254a009726cSJohn McCall typedef struct A<T>::hiding local; 255a009726cSJohn McCall struct hiding _ = local(); 256a009726cSJohn McCall } 257a009726cSJohn McCall 258a009726cSJohn McCall void test2() { 259a009726cSJohn McCall typedef struct A<T>::hiding local; 260a009726cSJohn McCall union hiding _ = local(); 261a009726cSJohn McCall } 262a009726cSJohn McCall #endif 263a009726cSJohn McCall test3test3::B264a009726cSJohn McCall void test3() { 265a009726cSJohn McCall char array[sizeof(union_member) == sizeof(double) ? 1 : -1]; 266a009726cSJohn McCall } 267a009726cSJohn McCall 268a009726cSJohn McCall #if 0 269a009726cSJohn McCall void test4() { 270a009726cSJohn McCall enum tagname _ = enumerator; 271a009726cSJohn McCall } 272a009726cSJohn McCall #endif 273a009726cSJohn McCall test5test3::B274a009726cSJohn McCall void test5() { 275a009726cSJohn McCall Opaque0 _ = hiding; 276a009726cSJohn McCall } 277a009726cSJohn McCall }; 278a009726cSJohn McCall 279a009726cSJohn McCall template struct B<int>; // expected-note {{in instantiation}} 280a009726cSJohn McCall } 281a009726cSJohn McCall 282a009726cSJohn McCall namespace test4 { 283a009726cSJohn McCall struct Base { 284a009726cSJohn McCall int foo(); 285a009726cSJohn McCall }; 286a009726cSJohn McCall 287a009726cSJohn McCall struct Unrelated { 288a009726cSJohn McCall int foo(); 289a009726cSJohn McCall }; 290a009726cSJohn McCall 291a009726cSJohn McCall struct Subclass : Base { 292a009726cSJohn McCall }; 293a009726cSJohn McCall 294a009726cSJohn McCall namespace InnerNS { 295a009726cSJohn McCall int foo(); 296a009726cSJohn McCall } 297a009726cSJohn McCall 298a009726cSJohn McCall // We should be able to diagnose these without instantiation. 299a009726cSJohn McCall template <class T> struct C : Base { 300*64a1a81eSCharles Li InnerNS::foo; // expected-error {{not a class}} 301*64a1a81eSCharles Li #if __cplusplus <= 199711L 302*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 303*64a1a81eSCharles Li #else 304*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 305*64a1a81eSCharles Li #endif 306a009726cSJohn McCall 307*64a1a81eSCharles Li Base::bar; // expected-error {{no member named 'bar'}} 308*64a1a81eSCharles Li #if __cplusplus <= 199711L 309*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 310*64a1a81eSCharles Li #else 311*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 312*64a1a81eSCharles Li #endif 313*64a1a81eSCharles Li 314*64a1a81eSCharles Li Unrelated::foo; // expected-error {{not a base class}} 315*64a1a81eSCharles Li #if __cplusplus <= 199711L 316*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 317*64a1a81eSCharles Li #else 318*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 319*64a1a81eSCharles Li #endif 320*64a1a81eSCharles Li 321*64a1a81eSCharles Li C::foo; // legal in C++03 322*64a1a81eSCharles Li #if __cplusplus <= 199711L 323*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 324*64a1a81eSCharles Li #else 325*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 326*64a1a81eSCharles Li // expected-error@-5 {{using declaration refers to its own class}} 327*64a1a81eSCharles Li #endif 328*64a1a81eSCharles Li 329*64a1a81eSCharles Li Subclass::foo; // legal in C++03 330*64a1a81eSCharles Li #if __cplusplus <= 199711L 331*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 332*64a1a81eSCharles Li #else 333*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 334*64a1a81eSCharles Li // expected-error@-5 {{using declaration refers into 'Subclass::', which is not a base class of 'C'}} 335*64a1a81eSCharles Li #endif 336*64a1a81eSCharles Li 337*64a1a81eSCharles Li int bar(); 338*64a1a81eSCharles Li #if __cplusplus <= 199711L 339*64a1a81eSCharles Li //expected-note@-2 {{target of using declaration}} 340*64a1a81eSCharles Li #endif 341*64a1a81eSCharles Li C::bar; 342*64a1a81eSCharles Li #if __cplusplus <= 199711L 343*64a1a81eSCharles Li // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 344*64a1a81eSCharles Li #else 345*64a1a81eSCharles Li // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 346*64a1a81eSCharles Li #endif 347*64a1a81eSCharles Li // expected-error@-6 {{using declaration refers to its own class}} 348a009726cSJohn McCall }; 349a009726cSJohn McCall } 350a009726cSJohn McCall 351