brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.6 KiB · b7ee6c9 Raw
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