xref: /llvm-project/clang/test/CXX/class.access/class.access.dcl/p1.cpp (revision 64a1a81e76b48ade6773887323476b2a6fb72c38)
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