348 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s3// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s4 5// This is just the test for [namespace.udecl]p4 with 'using'6// uniformly stripped out.7 8// C++03 [namespace.udecl]p4:9// A using-declaration used as a member-declaration shall refer to a10// member of a base class of the class being defined, shall refer to11// a member of an anonymous union that is a member of a base class12// of the class being defined, or shall refer to an enumerator for13// an enumeration type that is a member of a base class of the class14// being defined.15 16// There is no directly analogous paragraph in C++0x, and the feature17// works sufficiently differently there that it needs a separate test.18 19namespace test0 {20 namespace NonClass {21 typedef int type;22 struct hiding {};23 int hiding;24 static union { double union_member; };25 enum tagname { enumerator };26 }27 28 class Test0 {29 NonClass::type; // expected-error {{not a class}}30#if __cplusplus <= 199711L31 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}32#else33 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}34#endif35 36 NonClass::hiding; // expected-error {{not a class}}37#if __cplusplus <= 199711L38 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}39#else40 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}41#endif42 43 NonClass::union_member; // expected-error {{not a class}}44#if __cplusplus <= 199711L45 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}46#else47 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}48#endif49 50 NonClass::enumerator; // expected-error {{not a class}}51#if __cplusplus <= 199711L52 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}53#else54 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}55#endif56 };57}58 59struct Opaque0 {};60 61namespace test1 {62 struct A {63 typedef int type;64 struct hiding {}; // expected-note {{previous use is here}}65 Opaque0 hiding;66 union { double union_member; };67 enum tagname { enumerator };68 };69 70 struct B : A {71 A::type;72#if __cplusplus <= 199711L73 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}74#else75 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}76#endif77 A::hiding;78#if __cplusplus <= 199711L79 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}80#else81 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}82#endif83 84 A::union_member;85#if __cplusplus <= 199711L86 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}87#else88 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}89#endif90 91 A::enumerator;92#if __cplusplus <= 199711L93 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}94#else95 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}96#endif97 98 A::tagname;99#if __cplusplus <= 199711L100 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}101#else102 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}103#endif104 105 void test0() {106 type t = 0;107 }108 109 void test1() {110 typedef struct A::hiding local;111 struct hiding _ = local();112 }113 114 void test2() {115 union hiding _; // expected-error {{tag type that does not match previous}}116 }117 118 void test3() {119 char array[sizeof(union_member) == sizeof(double) ? 1 : -1];120 }121 122 void test4() {123 enum tagname _ = enumerator;124 }125 126 void test5() {127 Opaque0 _ = hiding;128 }129 };130}131 132namespace test2 {133 struct A {134 typedef int type;135 struct hiding {}; // expected-note {{previous use is here}}136 int hiding;137 union { double union_member; };138 enum tagname { enumerator };139 };140 141 template <class T> struct B : A {142 A::type;143#if __cplusplus <= 199711L144 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}145#else146 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}147#endif148 149 A::hiding;150#if __cplusplus <= 199711L151 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}152#else153 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}154#endif155 156 A::union_member;157#if __cplusplus <= 199711L158 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}159#else160 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}161#endif162 163 A::enumerator;164#if __cplusplus <= 199711L165 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}166#else167 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}168#endif169 170 A::tagname;171#if __cplusplus <= 199711L172 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}173#else174 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}175#endif176 177 void test0() {178 type t = 0;179 }180 181 void test1() {182 typedef struct A::hiding local;183 struct hiding _ = local();184 }185 186 void test2() {187 union hiding _; // expected-error {{tag type that does not match previous}}188 }189 190 void test3() {191 char array[sizeof(union_member) == sizeof(double) ? 1 : -1];192 }193 194 void test4() {195 enum tagname _ = enumerator;196 }197 198 void test5() {199 Opaque0 _ = hiding;200 }201 };202}203 204namespace test3 {205 struct hiding {};206 207 template <class T> struct A {208 typedef int type; // expected-note {{target of using declaration}}209 struct hiding {};210 Opaque0 hiding;211 union { double union_member; };212 enum tagname { enumerator }; // expected-note {{target of using declaration}}213 };214 215 template <class T> struct B : A<T> {216 A<T>::type; // expected-error {{dependent using declaration resolved to type without 'typename'}}217#if __cplusplus <= 199711L218 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}219#else220 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}221#endif222 223 A<T>::hiding;224#if __cplusplus <= 199711L225 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}226#else227 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}228#endif229 230 A<T>::union_member;231#if __cplusplus <= 199711L232 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}233#else234 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}235#endif236 237 A<T>::enumerator;238#if __cplusplus <= 199711L239 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}240#else241 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}242#endif243 244 A<T>::tagname; // expected-error {{dependent using declaration resolved to type without 'typename'}}245#if __cplusplus <= 199711L246 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}247#else248 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}249#endif250 251 // FIXME: re-enable these when the various bugs involving tags are fixed252#if 0253 void test1() {254 typedef struct A<T>::hiding local;255 struct hiding _ = local();256 }257 258 void test2() {259 typedef struct A<T>::hiding local;260 union hiding _ = local();261 }262#endif263 264 void test3() {265 char array[sizeof(union_member) == sizeof(double) ? 1 : -1];266 }267 268#if 0269 void test4() {270 enum tagname _ = enumerator;271 }272#endif273 274 void test5() {275 Opaque0 _ = hiding;276 }277 };278 279 template struct B<int>; // expected-note {{in instantiation}}280}281 282namespace test4 {283 struct Base {284 int foo();285 };286 287 struct Unrelated {288 int foo();289 };290 291 struct Subclass : Base {292 };293 294 namespace InnerNS {295 int foo();296 }297 298 // We should be able to diagnose these without instantiation.299 template <class T> struct C : Base {300 InnerNS::foo; // expected-error {{not a class}}301#if __cplusplus <= 199711L302 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}303#else304 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}305#endif306 307 Base::bar; // expected-error {{no member named 'bar'}}308#if __cplusplus <= 199711L309 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}310#else311 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}312#endif313 314 Unrelated::foo; // expected-error {{not a base class}}315#if __cplusplus <= 199711L316 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}317#else318 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}319#endif320 321 C::foo;322#if __cplusplus <= 199711L323 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}324#else325 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}326#endif327 // expected-error@-6 {{using declaration refers to its own class}}328 329 Subclass::foo;330#if __cplusplus <= 199711L331 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}332#else333 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}334#endif335 // expected-error@-6 {{using declaration refers into 'Subclass', which is not a base class of 'C'}}336 337 int bar();338 C::bar;339#if __cplusplus <= 199711L340 // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}341#else342 // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}343#endif344 // expected-error@-6 {{using declaration refers to its own class}}345 };346}347 348