12299fc18956b8aca0ec270bc848987be53564438Benjamin Kramer// RUN: %clang_cc1 -fsyntax-only -verify %s
24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
474fa91164768a5469fd299206e893349dcd3c343John McCall
574fa91164768a5469fd299206e893349dcd3c343John McCall// This is just the test for [namespace.udecl]p4 with 'using'
674fa91164768a5469fd299206e893349dcd3c343John McCall// uniformly stripped out.
774fa91164768a5469fd299206e893349dcd3c343John McCall
874fa91164768a5469fd299206e893349dcd3c343John McCall// C++03 [namespace.udecl]p4:
974fa91164768a5469fd299206e893349dcd3c343John McCall//   A using-declaration used as a member-declaration shall refer to a
1074fa91164768a5469fd299206e893349dcd3c343John McCall//   member of a base class of the class being defined, shall refer to
1174fa91164768a5469fd299206e893349dcd3c343John McCall//   a member of an anonymous union that is a member of a base class
1274fa91164768a5469fd299206e893349dcd3c343John McCall//   of the class being defined, or shall refer to an enumerator for
1374fa91164768a5469fd299206e893349dcd3c343John McCall//   an enumeration type that is a member of a base class of the class
1474fa91164768a5469fd299206e893349dcd3c343John McCall//   being defined.
1574fa91164768a5469fd299206e893349dcd3c343John McCall
1674fa91164768a5469fd299206e893349dcd3c343John McCall// There is no directly analogous paragraph in C++0x, and the feature
1774fa91164768a5469fd299206e893349dcd3c343John McCall// works sufficiently differently there that it needs a separate test.
1874fa91164768a5469fd299206e893349dcd3c343John McCall
1974fa91164768a5469fd299206e893349dcd3c343John McCallnamespace test0 {
2074fa91164768a5469fd299206e893349dcd3c343John McCall  namespace NonClass {
2174fa91164768a5469fd299206e893349dcd3c343John McCall    typedef int type;
2274fa91164768a5469fd299206e893349dcd3c343John McCall    struct hiding {};
2374fa91164768a5469fd299206e893349dcd3c343John McCall    int hiding;
2474fa91164768a5469fd299206e893349dcd3c343John McCall    static union { double union_member; };
2574fa91164768a5469fd299206e893349dcd3c343John McCall    enum tagname { enumerator };
2674fa91164768a5469fd299206e893349dcd3c343John McCall  }
2774fa91164768a5469fd299206e893349dcd3c343John McCall
2874fa91164768a5469fd299206e893349dcd3c343John McCall  class Test0 {
294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    NonClass::type; // expected-error {{not a class}}
304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    NonClass::hiding; // expected-error {{not a class}}
374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    NonClass::union_member; // expected-error {{not a class}}
444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    NonClass::enumerator; // expected-error {{not a class}}
514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
5674fa91164768a5469fd299206e893349dcd3c343John McCall  };
5774fa91164768a5469fd299206e893349dcd3c343John McCall}
5874fa91164768a5469fd299206e893349dcd3c343John McCall
5974fa91164768a5469fd299206e893349dcd3c343John McCallstruct Opaque0 {};
6074fa91164768a5469fd299206e893349dcd3c343John McCall
6174fa91164768a5469fd299206e893349dcd3c343John McCallnamespace test1 {
6274fa91164768a5469fd299206e893349dcd3c343John McCall  struct A {
6374fa91164768a5469fd299206e893349dcd3c343John McCall    typedef int type;
6474fa91164768a5469fd299206e893349dcd3c343John McCall    struct hiding {}; // expected-note {{previous use is here}}
6574fa91164768a5469fd299206e893349dcd3c343John McCall    Opaque0 hiding;
6674fa91164768a5469fd299206e893349dcd3c343John McCall    union { double union_member; };
6774fa91164768a5469fd299206e893349dcd3c343John McCall    enum tagname { enumerator };
6874fa91164768a5469fd299206e893349dcd3c343John McCall  };
6974fa91164768a5469fd299206e893349dcd3c343John McCall
7074fa91164768a5469fd299206e893349dcd3c343John McCall  struct B : A {
714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A::type;
724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A::hiding;
784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A::union_member;
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A::enumerator;
924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A::tagname;
994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
10474fa91164768a5469fd299206e893349dcd3c343John McCall
10574fa91164768a5469fd299206e893349dcd3c343John McCall    void test0() {
10674fa91164768a5469fd299206e893349dcd3c343John McCall      type t = 0;
10774fa91164768a5469fd299206e893349dcd3c343John McCall    }
10874fa91164768a5469fd299206e893349dcd3c343John McCall
10974fa91164768a5469fd299206e893349dcd3c343John McCall    void test1() {
11074fa91164768a5469fd299206e893349dcd3c343John McCall      typedef struct A::hiding local;
11174fa91164768a5469fd299206e893349dcd3c343John McCall      struct hiding _ = local();
11274fa91164768a5469fd299206e893349dcd3c343John McCall    }
11374fa91164768a5469fd299206e893349dcd3c343John McCall
11474fa91164768a5469fd299206e893349dcd3c343John McCall    void test2() {
11574fa91164768a5469fd299206e893349dcd3c343John McCall      union hiding _; // expected-error {{tag type that does not match previous}}
11674fa91164768a5469fd299206e893349dcd3c343John McCall    }
11774fa91164768a5469fd299206e893349dcd3c343John McCall
11874fa91164768a5469fd299206e893349dcd3c343John McCall    void test3() {
11974fa91164768a5469fd299206e893349dcd3c343John McCall      char array[sizeof(union_member) == sizeof(double) ? 1 : -1];
12074fa91164768a5469fd299206e893349dcd3c343John McCall    }
12174fa91164768a5469fd299206e893349dcd3c343John McCall
12274fa91164768a5469fd299206e893349dcd3c343John McCall    void test4() {
12374fa91164768a5469fd299206e893349dcd3c343John McCall      enum tagname _ = enumerator;
12474fa91164768a5469fd299206e893349dcd3c343John McCall    }
12574fa91164768a5469fd299206e893349dcd3c343John McCall
12674fa91164768a5469fd299206e893349dcd3c343John McCall    void test5() {
12774fa91164768a5469fd299206e893349dcd3c343John McCall      Opaque0 _ = hiding;
12874fa91164768a5469fd299206e893349dcd3c343John McCall    }
12974fa91164768a5469fd299206e893349dcd3c343John McCall  };
13074fa91164768a5469fd299206e893349dcd3c343John McCall}
13174fa91164768a5469fd299206e893349dcd3c343John McCall
13274fa91164768a5469fd299206e893349dcd3c343John McCallnamespace test2 {
13374fa91164768a5469fd299206e893349dcd3c343John McCall  struct A {
13474fa91164768a5469fd299206e893349dcd3c343John McCall    typedef int type;
13574fa91164768a5469fd299206e893349dcd3c343John McCall    struct hiding {}; // expected-note {{previous use is here}}
13674fa91164768a5469fd299206e893349dcd3c343John McCall    int hiding;
13774fa91164768a5469fd299206e893349dcd3c343John McCall    union { double union_member; };
13874fa91164768a5469fd299206e893349dcd3c343John McCall    enum tagname { enumerator };
13974fa91164768a5469fd299206e893349dcd3c343John McCall  };
14074fa91164768a5469fd299206e893349dcd3c343John McCall
14174fa91164768a5469fd299206e893349dcd3c343John McCall  template <class T> struct B : A {
1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A::type;
1434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A::hiding;
1504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
1524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
1544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A::union_member;
1574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
1594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
1604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
1614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A::enumerator;
1644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
1664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
1674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
1684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A::tagname;
1714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
1734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
1744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
1754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
17674fa91164768a5469fd299206e893349dcd3c343John McCall
17774fa91164768a5469fd299206e893349dcd3c343John McCall    void test0() {
17874fa91164768a5469fd299206e893349dcd3c343John McCall      type t = 0;
17974fa91164768a5469fd299206e893349dcd3c343John McCall    }
18074fa91164768a5469fd299206e893349dcd3c343John McCall
18174fa91164768a5469fd299206e893349dcd3c343John McCall    void test1() {
18274fa91164768a5469fd299206e893349dcd3c343John McCall      typedef struct A::hiding local;
18374fa91164768a5469fd299206e893349dcd3c343John McCall      struct hiding _ = local();
18474fa91164768a5469fd299206e893349dcd3c343John McCall    }
18574fa91164768a5469fd299206e893349dcd3c343John McCall
18674fa91164768a5469fd299206e893349dcd3c343John McCall    void test2() {
18774fa91164768a5469fd299206e893349dcd3c343John McCall      union hiding _; // expected-error {{tag type that does not match previous}}
18874fa91164768a5469fd299206e893349dcd3c343John McCall    }
18974fa91164768a5469fd299206e893349dcd3c343John McCall
19074fa91164768a5469fd299206e893349dcd3c343John McCall    void test3() {
19174fa91164768a5469fd299206e893349dcd3c343John McCall      char array[sizeof(union_member) == sizeof(double) ? 1 : -1];
19274fa91164768a5469fd299206e893349dcd3c343John McCall    }
19374fa91164768a5469fd299206e893349dcd3c343John McCall
19474fa91164768a5469fd299206e893349dcd3c343John McCall    void test4() {
19574fa91164768a5469fd299206e893349dcd3c343John McCall      enum tagname _ = enumerator;
19674fa91164768a5469fd299206e893349dcd3c343John McCall    }
19774fa91164768a5469fd299206e893349dcd3c343John McCall
19874fa91164768a5469fd299206e893349dcd3c343John McCall    void test5() {
19974fa91164768a5469fd299206e893349dcd3c343John McCall      Opaque0 _ = hiding;
20074fa91164768a5469fd299206e893349dcd3c343John McCall    }
20174fa91164768a5469fd299206e893349dcd3c343John McCall  };
20274fa91164768a5469fd299206e893349dcd3c343John McCall}
20374fa91164768a5469fd299206e893349dcd3c343John McCall
20474fa91164768a5469fd299206e893349dcd3c343John McCallnamespace test3 {
20574fa91164768a5469fd299206e893349dcd3c343John McCall  struct hiding {};
20674fa91164768a5469fd299206e893349dcd3c343John McCall
20774fa91164768a5469fd299206e893349dcd3c343John McCall  template <class T> struct A {
20874fa91164768a5469fd299206e893349dcd3c343John McCall    typedef int type; // expected-note {{target of using declaration}}
20974fa91164768a5469fd299206e893349dcd3c343John McCall    struct hiding {};
21074fa91164768a5469fd299206e893349dcd3c343John McCall    Opaque0 hiding;
21174fa91164768a5469fd299206e893349dcd3c343John McCall    union { double union_member; };
21274fa91164768a5469fd299206e893349dcd3c343John McCall    enum tagname { enumerator }; // expected-note {{target of using declaration}}
21374fa91164768a5469fd299206e893349dcd3c343John McCall  };
21474fa91164768a5469fd299206e893349dcd3c343John McCall
21574fa91164768a5469fd299206e893349dcd3c343John McCall  template <class T> struct B : A<T> {
2164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A<T>::type; // expected-error {{dependent using declaration resolved to type without 'typename'}}
2174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
2184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
2194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
2204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
2214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
2224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A<T>::hiding;
2244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
2254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
2264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
2274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
2284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
2294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A<T>::union_member;
2314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
2324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
2334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
2344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
2354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
2364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A<T>::enumerator;
2384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
2394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
2404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
2414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
2424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
2434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    A<T>::tagname; // expected-error {{dependent using declaration resolved to type without 'typename'}}
2454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
2464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
2474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
2484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
2494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
25074fa91164768a5469fd299206e893349dcd3c343John McCall
25174fa91164768a5469fd299206e893349dcd3c343John McCall    // FIXME: re-enable these when the various bugs involving tags are fixed
25274fa91164768a5469fd299206e893349dcd3c343John McCall#if 0
25374fa91164768a5469fd299206e893349dcd3c343John McCall    void test1() {
25474fa91164768a5469fd299206e893349dcd3c343John McCall      typedef struct A<T>::hiding local;
25574fa91164768a5469fd299206e893349dcd3c343John McCall      struct hiding _ = local();
25674fa91164768a5469fd299206e893349dcd3c343John McCall    }
25774fa91164768a5469fd299206e893349dcd3c343John McCall
25874fa91164768a5469fd299206e893349dcd3c343John McCall    void test2() {
25974fa91164768a5469fd299206e893349dcd3c343John McCall      typedef struct A<T>::hiding local;
26074fa91164768a5469fd299206e893349dcd3c343John McCall      union hiding _ = local();
26174fa91164768a5469fd299206e893349dcd3c343John McCall    }
26274fa91164768a5469fd299206e893349dcd3c343John McCall#endif
26374fa91164768a5469fd299206e893349dcd3c343John McCall
26474fa91164768a5469fd299206e893349dcd3c343John McCall    void test3() {
26574fa91164768a5469fd299206e893349dcd3c343John McCall      char array[sizeof(union_member) == sizeof(double) ? 1 : -1];
26674fa91164768a5469fd299206e893349dcd3c343John McCall    }
26774fa91164768a5469fd299206e893349dcd3c343John McCall
26874fa91164768a5469fd299206e893349dcd3c343John McCall#if 0
26974fa91164768a5469fd299206e893349dcd3c343John McCall    void test4() {
27074fa91164768a5469fd299206e893349dcd3c343John McCall      enum tagname _ = enumerator;
27174fa91164768a5469fd299206e893349dcd3c343John McCall    }
27274fa91164768a5469fd299206e893349dcd3c343John McCall#endif
27374fa91164768a5469fd299206e893349dcd3c343John McCall
27474fa91164768a5469fd299206e893349dcd3c343John McCall    void test5() {
27574fa91164768a5469fd299206e893349dcd3c343John McCall      Opaque0 _ = hiding;
27674fa91164768a5469fd299206e893349dcd3c343John McCall    }
27774fa91164768a5469fd299206e893349dcd3c343John McCall  };
27874fa91164768a5469fd299206e893349dcd3c343John McCall
27974fa91164768a5469fd299206e893349dcd3c343John McCall  template struct B<int>; // expected-note {{in instantiation}}
28074fa91164768a5469fd299206e893349dcd3c343John McCall}
28174fa91164768a5469fd299206e893349dcd3c343John McCall
28274fa91164768a5469fd299206e893349dcd3c343John McCallnamespace test4 {
28374fa91164768a5469fd299206e893349dcd3c343John McCall  struct Base {
28474fa91164768a5469fd299206e893349dcd3c343John McCall    int foo();
28574fa91164768a5469fd299206e893349dcd3c343John McCall  };
28674fa91164768a5469fd299206e893349dcd3c343John McCall
28774fa91164768a5469fd299206e893349dcd3c343John McCall  struct Unrelated {
28874fa91164768a5469fd299206e893349dcd3c343John McCall    int foo();
28974fa91164768a5469fd299206e893349dcd3c343John McCall  };
29074fa91164768a5469fd299206e893349dcd3c343John McCall
29174fa91164768a5469fd299206e893349dcd3c343John McCall  struct Subclass : Base {
29274fa91164768a5469fd299206e893349dcd3c343John McCall  };
29374fa91164768a5469fd299206e893349dcd3c343John McCall
29474fa91164768a5469fd299206e893349dcd3c343John McCall  namespace InnerNS {
29574fa91164768a5469fd299206e893349dcd3c343John McCall    int foo();
29674fa91164768a5469fd299206e893349dcd3c343John McCall  }
29774fa91164768a5469fd299206e893349dcd3c343John McCall
29874fa91164768a5469fd299206e893349dcd3c343John McCall  // We should be able to diagnose these without instantiation.
29974fa91164768a5469fd299206e893349dcd3c343John McCall  template <class T> struct C : Base {
3004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    InnerNS::foo; // expected-error {{not a class}}
3014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
3024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
3034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
3044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
3054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
3064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Base::bar; // expected-error {{no member named 'bar'}}
3084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
3094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
3104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
3114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
3124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
3134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Unrelated::foo; // expected-error {{not a base class}}
3154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
3164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
3174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
3184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
3194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
3204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    C::foo; // legal in C++03
3224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
3234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
3244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
3254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
3264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-5 {{using declaration refers to its own class}}
3274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
3284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Subclass::foo; // legal in C++03
3304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
3314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
3324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
3334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
3344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-5 {{using declaration refers into 'Subclass::', which is not a base class of 'C'}}
3354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
3364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    int bar();
3384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
3394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    //expected-note@-2 {{target of using declaration}}
3404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
3414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    C::bar;
3424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
3434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}}
3444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
3454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}}
3464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
3474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-6 {{using declaration refers to its own class}}
34874fa91164768a5469fd299206e893349dcd3c343John McCall  };
34974fa91164768a5469fd299206e893349dcd3c343John McCall}
35074fa91164768a5469fd299206e893349dcd3c343John McCall
351