xref: /llvm-project/clang/test/SemaCXX/using-hiding.cpp (revision 9e11a6d8fdd745f20bada10473b701d2e21492a5)
1*9e11a6d8SJohn Brawn // RUN: %clang_cc1 -fsyntax-only -verify %s
2*9e11a6d8SJohn Brawn 
3*9e11a6d8SJohn Brawn namespace A {
4*9e11a6d8SJohn Brawn   class X { }; // expected-note{{candidate found by name lookup is 'A::X'}}
5*9e11a6d8SJohn Brawn                // expected-note@-1{{candidate found by name lookup is 'A::X'}}
6*9e11a6d8SJohn Brawn }
7*9e11a6d8SJohn Brawn namespace B {
8*9e11a6d8SJohn Brawn   void X(int); // expected-note{{candidate found by name lookup is 'B::X'}}
9*9e11a6d8SJohn Brawn                // expected-note@-1{{candidate found by name lookup is 'B::X'}}
10*9e11a6d8SJohn Brawn }
11*9e11a6d8SJohn Brawn 
12*9e11a6d8SJohn Brawn // Using directive doesn't cause A::X to be hidden, so X is ambiguous.
13*9e11a6d8SJohn Brawn namespace Test1a {
14*9e11a6d8SJohn Brawn   using namespace A;
15*9e11a6d8SJohn Brawn   using namespace B;
16*9e11a6d8SJohn Brawn 
f()17*9e11a6d8SJohn Brawn   void f() {
18*9e11a6d8SJohn Brawn     X(1); // expected-error{{reference to 'X' is ambiguous}}
19*9e11a6d8SJohn Brawn   }
20*9e11a6d8SJohn Brawn }
21*9e11a6d8SJohn Brawn 
22*9e11a6d8SJohn Brawn namespace Test1b {
23*9e11a6d8SJohn Brawn   using namespace B;
24*9e11a6d8SJohn Brawn   using namespace A;
25*9e11a6d8SJohn Brawn 
f()26*9e11a6d8SJohn Brawn   void f() {
27*9e11a6d8SJohn Brawn     X(1); // expected-error{{reference to 'X' is ambiguous}}
28*9e11a6d8SJohn Brawn   }
29*9e11a6d8SJohn Brawn }
30*9e11a6d8SJohn Brawn 
31*9e11a6d8SJohn Brawn // The behaviour here should be the same as using namespaces A and B directly
32*9e11a6d8SJohn Brawn namespace Test2a {
33*9e11a6d8SJohn Brawn   namespace C {
34*9e11a6d8SJohn Brawn     using A::X; // expected-note{{candidate found by name lookup is 'Test2a::C::X'}}
35*9e11a6d8SJohn Brawn   }
36*9e11a6d8SJohn Brawn   namespace D {
37*9e11a6d8SJohn Brawn     using B::X; // expected-note{{candidate found by name lookup is 'Test2a::D::X'}}
38*9e11a6d8SJohn Brawn   }
39*9e11a6d8SJohn Brawn   using namespace C;
40*9e11a6d8SJohn Brawn   using namespace D;
41*9e11a6d8SJohn Brawn 
f()42*9e11a6d8SJohn Brawn   void f() {
43*9e11a6d8SJohn Brawn     X(1); // expected-error{{reference to 'X' is ambiguous}}
44*9e11a6d8SJohn Brawn   }
45*9e11a6d8SJohn Brawn }
46*9e11a6d8SJohn Brawn 
47*9e11a6d8SJohn Brawn namespace Test2b {
48*9e11a6d8SJohn Brawn   namespace C {
49*9e11a6d8SJohn Brawn     using A::X; // expected-note{{candidate found by name lookup is 'Test2b::C::X'}}
50*9e11a6d8SJohn Brawn   }
51*9e11a6d8SJohn Brawn   namespace D {
52*9e11a6d8SJohn Brawn     using B::X; // expected-note{{candidate found by name lookup is 'Test2b::D::X'}}
53*9e11a6d8SJohn Brawn   }
54*9e11a6d8SJohn Brawn   using namespace D;
55*9e11a6d8SJohn Brawn   using namespace C;
56*9e11a6d8SJohn Brawn 
f()57*9e11a6d8SJohn Brawn   void f() {
58*9e11a6d8SJohn Brawn     X(1); // expected-error{{reference to 'X' is ambiguous}}
59*9e11a6d8SJohn Brawn   }
60*9e11a6d8SJohn Brawn }
61*9e11a6d8SJohn Brawn 
62*9e11a6d8SJohn Brawn // Defining a function X inside C should hide using A::X in C but not D, so the result is ambiguous.
63*9e11a6d8SJohn Brawn namespace Test3a {
64*9e11a6d8SJohn Brawn   namespace C {
65*9e11a6d8SJohn Brawn     using A::X;
66*9e11a6d8SJohn Brawn     void X(int); // expected-note{{candidate found by name lookup is 'Test3a::C::X'}}
67*9e11a6d8SJohn Brawn   }
68*9e11a6d8SJohn Brawn   namespace D {
69*9e11a6d8SJohn Brawn     using A::X; // expected-note{{candidate found by name lookup is 'Test3a::D::X'}}
70*9e11a6d8SJohn Brawn   }
71*9e11a6d8SJohn Brawn   using namespace C;
72*9e11a6d8SJohn Brawn   using namespace D;
f()73*9e11a6d8SJohn Brawn   void f() {
74*9e11a6d8SJohn Brawn     X(1); // expected-error{{reference to 'X' is ambiguous}}
75*9e11a6d8SJohn Brawn   }
76*9e11a6d8SJohn Brawn }
77*9e11a6d8SJohn Brawn 
78*9e11a6d8SJohn Brawn namespace Test3b {
79*9e11a6d8SJohn Brawn   namespace C {
80*9e11a6d8SJohn Brawn     using A::X;
81*9e11a6d8SJohn Brawn     void X(int); // expected-note{{candidate found by name lookup is 'Test3b::C::X'}}
82*9e11a6d8SJohn Brawn   }
83*9e11a6d8SJohn Brawn   namespace D {
84*9e11a6d8SJohn Brawn     using A::X; // expected-note{{candidate found by name lookup is 'Test3b::D::X'}}
85*9e11a6d8SJohn Brawn   }
86*9e11a6d8SJohn Brawn   using namespace D;
87*9e11a6d8SJohn Brawn   using namespace C;
f()88*9e11a6d8SJohn Brawn   void f() {
89*9e11a6d8SJohn Brawn     X(1); // expected-error{{reference to 'X' is ambiguous}}
90*9e11a6d8SJohn Brawn   }
91*9e11a6d8SJohn Brawn }
92*9e11a6d8SJohn Brawn 
93*9e11a6d8SJohn Brawn namespace Test3c {
94*9e11a6d8SJohn Brawn   namespace C {
95*9e11a6d8SJohn Brawn     void X(int); // expected-note{{candidate found by name lookup is 'Test3c::C::X'}}
96*9e11a6d8SJohn Brawn     using A::X;
97*9e11a6d8SJohn Brawn   }
98*9e11a6d8SJohn Brawn   namespace D {
99*9e11a6d8SJohn Brawn     using A::X; // expected-note{{candidate found by name lookup is 'Test3c::D::X'}}
100*9e11a6d8SJohn Brawn   }
101*9e11a6d8SJohn Brawn   using namespace C;
102*9e11a6d8SJohn Brawn   using namespace D;
f()103*9e11a6d8SJohn Brawn   void f() {
104*9e11a6d8SJohn Brawn     X(1); // expected-error{{reference to 'X' is ambiguous}}
105*9e11a6d8SJohn Brawn   }
106*9e11a6d8SJohn Brawn }
107*9e11a6d8SJohn Brawn 
108*9e11a6d8SJohn Brawn namespace Test3d {
109*9e11a6d8SJohn Brawn   namespace C {
110*9e11a6d8SJohn Brawn     void X(int); // expected-note{{candidate found by name lookup is 'Test3d::C::X'}}
111*9e11a6d8SJohn Brawn     using A::X;
112*9e11a6d8SJohn Brawn   }
113*9e11a6d8SJohn Brawn   namespace D {
114*9e11a6d8SJohn Brawn     using A::X; // expected-note{{candidate found by name lookup is 'Test3d::D::X'}}
115*9e11a6d8SJohn Brawn   }
116*9e11a6d8SJohn Brawn   using namespace D;
117*9e11a6d8SJohn Brawn   using namespace C;
f()118*9e11a6d8SJohn Brawn   void f() {
119*9e11a6d8SJohn Brawn     X(1); // expected-error{{reference to 'X' is ambiguous}}
120*9e11a6d8SJohn Brawn   }
121*9e11a6d8SJohn Brawn }
122*9e11a6d8SJohn Brawn 
123*9e11a6d8SJohn Brawn // A::X hidden in both C and D by overloaded function, so the result is not ambiguous.
124*9e11a6d8SJohn Brawn namespace Test4a {
125*9e11a6d8SJohn Brawn   namespace C {
126*9e11a6d8SJohn Brawn     using A::X;
127*9e11a6d8SJohn Brawn     void X(int);
128*9e11a6d8SJohn Brawn   }
129*9e11a6d8SJohn Brawn   namespace D {
130*9e11a6d8SJohn Brawn     using A::X;
131*9e11a6d8SJohn Brawn     void X(int, int);
132*9e11a6d8SJohn Brawn   }
133*9e11a6d8SJohn Brawn   using namespace C;
134*9e11a6d8SJohn Brawn   using namespace D;
f()135*9e11a6d8SJohn Brawn   void f() {
136*9e11a6d8SJohn Brawn     X(1);
137*9e11a6d8SJohn Brawn   }
138*9e11a6d8SJohn Brawn }
139*9e11a6d8SJohn Brawn 
140*9e11a6d8SJohn Brawn namespace Test4b {
141*9e11a6d8SJohn Brawn   namespace C {
142*9e11a6d8SJohn Brawn     using A::X;
143*9e11a6d8SJohn Brawn     void X(int);
144*9e11a6d8SJohn Brawn   }
145*9e11a6d8SJohn Brawn   namespace D {
146*9e11a6d8SJohn Brawn     using A::X;
147*9e11a6d8SJohn Brawn     void X(int, int);
148*9e11a6d8SJohn Brawn   }
149*9e11a6d8SJohn Brawn   using namespace D;
150*9e11a6d8SJohn Brawn   using namespace C;
f()151*9e11a6d8SJohn Brawn   void f() {
152*9e11a6d8SJohn Brawn     X(1);
153*9e11a6d8SJohn Brawn   }
154*9e11a6d8SJohn Brawn }
155*9e11a6d8SJohn Brawn 
156*9e11a6d8SJohn Brawn namespace Test4c {
157*9e11a6d8SJohn Brawn   namespace C {
158*9e11a6d8SJohn Brawn     void X(int);
159*9e11a6d8SJohn Brawn     using A::X;
160*9e11a6d8SJohn Brawn   }
161*9e11a6d8SJohn Brawn   namespace D {
162*9e11a6d8SJohn Brawn     void X(int, int);
163*9e11a6d8SJohn Brawn     using A::X;
164*9e11a6d8SJohn Brawn   }
165*9e11a6d8SJohn Brawn   using namespace C;
166*9e11a6d8SJohn Brawn   using namespace D;
f()167*9e11a6d8SJohn Brawn   void f() {
168*9e11a6d8SJohn Brawn     X(1);
169*9e11a6d8SJohn Brawn   }
170*9e11a6d8SJohn Brawn }
171*9e11a6d8SJohn Brawn 
172*9e11a6d8SJohn Brawn namespace Test4d {
173*9e11a6d8SJohn Brawn   namespace C {
174*9e11a6d8SJohn Brawn     void X(int);
175*9e11a6d8SJohn Brawn     using A::X;
176*9e11a6d8SJohn Brawn   }
177*9e11a6d8SJohn Brawn   namespace D {
178*9e11a6d8SJohn Brawn     void X(int, int);
179*9e11a6d8SJohn Brawn     using A::X;
180*9e11a6d8SJohn Brawn   }
181*9e11a6d8SJohn Brawn   using namespace D;
182*9e11a6d8SJohn Brawn   using namespace C;
f()183*9e11a6d8SJohn Brawn   void f() {
184*9e11a6d8SJohn Brawn     X(1);
185*9e11a6d8SJohn Brawn   }
186*9e11a6d8SJohn Brawn }
187*9e11a6d8SJohn Brawn 
188*9e11a6d8SJohn Brawn // B::X hides class X in C, so the the result is not ambiguous
189*9e11a6d8SJohn Brawn namespace Test5a {
190*9e11a6d8SJohn Brawn   namespace C {
191*9e11a6d8SJohn Brawn     using B::X;
192*9e11a6d8SJohn Brawn     class X { };
193*9e11a6d8SJohn Brawn   }
194*9e11a6d8SJohn Brawn   namespace D {
195*9e11a6d8SJohn Brawn     using B::X;
196*9e11a6d8SJohn Brawn   }
197*9e11a6d8SJohn Brawn   using namespace C;
198*9e11a6d8SJohn Brawn   using namespace D;
f()199*9e11a6d8SJohn Brawn   void f() {
200*9e11a6d8SJohn Brawn     X(1);
201*9e11a6d8SJohn Brawn   }
202*9e11a6d8SJohn Brawn }
203*9e11a6d8SJohn Brawn 
204*9e11a6d8SJohn Brawn namespace Test5b {
205*9e11a6d8SJohn Brawn   namespace C {
206*9e11a6d8SJohn Brawn     using B::X;
207*9e11a6d8SJohn Brawn     class X { };
208*9e11a6d8SJohn Brawn   }
209*9e11a6d8SJohn Brawn   namespace D {
210*9e11a6d8SJohn Brawn     using B::X;
211*9e11a6d8SJohn Brawn   }
212*9e11a6d8SJohn Brawn   using namespace D;
213*9e11a6d8SJohn Brawn   using namespace C;
f()214*9e11a6d8SJohn Brawn   void f() {
215*9e11a6d8SJohn Brawn     X(1);
216*9e11a6d8SJohn Brawn   }
217*9e11a6d8SJohn Brawn }
218*9e11a6d8SJohn Brawn 
219*9e11a6d8SJohn Brawn namespace Test5c {
220*9e11a6d8SJohn Brawn   namespace C {
221*9e11a6d8SJohn Brawn     class X { };
222*9e11a6d8SJohn Brawn     using B::X;
223*9e11a6d8SJohn Brawn   }
224*9e11a6d8SJohn Brawn   namespace D {
225*9e11a6d8SJohn Brawn     using B::X;
226*9e11a6d8SJohn Brawn   }
227*9e11a6d8SJohn Brawn   using namespace C;
228*9e11a6d8SJohn Brawn   using namespace D;
f()229*9e11a6d8SJohn Brawn   void f() {
230*9e11a6d8SJohn Brawn     X(1);
231*9e11a6d8SJohn Brawn   }
232*9e11a6d8SJohn Brawn }
233*9e11a6d8SJohn Brawn 
234*9e11a6d8SJohn Brawn namespace Test5d {
235*9e11a6d8SJohn Brawn   namespace C {
236*9e11a6d8SJohn Brawn     class X { };
237*9e11a6d8SJohn Brawn     using B::X;
238*9e11a6d8SJohn Brawn   }
239*9e11a6d8SJohn Brawn   namespace D {
240*9e11a6d8SJohn Brawn     using B::X;
241*9e11a6d8SJohn Brawn   }
242*9e11a6d8SJohn Brawn   using namespace D;
243*9e11a6d8SJohn Brawn   using namespace C;
f()244*9e11a6d8SJohn Brawn   void f() {
245*9e11a6d8SJohn Brawn     X(1);
246*9e11a6d8SJohn Brawn   }
247*9e11a6d8SJohn Brawn }
248*9e11a6d8SJohn Brawn 
249*9e11a6d8SJohn Brawn // B::X hides class X declared in both C and D, so the result is not ambiguous.
250*9e11a6d8SJohn Brawn namespace Test6a {
251*9e11a6d8SJohn Brawn   namespace C {
252*9e11a6d8SJohn Brawn     class X { };
253*9e11a6d8SJohn Brawn     using B::X;
254*9e11a6d8SJohn Brawn   }
255*9e11a6d8SJohn Brawn   namespace D {
256*9e11a6d8SJohn Brawn     class X { };
257*9e11a6d8SJohn Brawn     using B::X;
258*9e11a6d8SJohn Brawn   }
259*9e11a6d8SJohn Brawn   using namespace C;
260*9e11a6d8SJohn Brawn   using namespace D;
f()261*9e11a6d8SJohn Brawn   void f() {
262*9e11a6d8SJohn Brawn     X(1);
263*9e11a6d8SJohn Brawn   }
264*9e11a6d8SJohn Brawn }
265*9e11a6d8SJohn Brawn 
266*9e11a6d8SJohn Brawn namespace Test6b {
267*9e11a6d8SJohn Brawn   namespace C {
268*9e11a6d8SJohn Brawn     class X { };
269*9e11a6d8SJohn Brawn     using B::X;
270*9e11a6d8SJohn Brawn   }
271*9e11a6d8SJohn Brawn   namespace D {
272*9e11a6d8SJohn Brawn     class X { };
273*9e11a6d8SJohn Brawn     using B::X;
274*9e11a6d8SJohn Brawn   }
275*9e11a6d8SJohn Brawn   using namespace D;
276*9e11a6d8SJohn Brawn   using namespace C;
f()277*9e11a6d8SJohn Brawn   void f() {
278*9e11a6d8SJohn Brawn     X(1);
279*9e11a6d8SJohn Brawn   }
280*9e11a6d8SJohn Brawn }
281*9e11a6d8SJohn Brawn 
282*9e11a6d8SJohn Brawn namespace Test6c {
283*9e11a6d8SJohn Brawn   namespace C {
284*9e11a6d8SJohn Brawn     using B::X;
285*9e11a6d8SJohn Brawn     class X { };
286*9e11a6d8SJohn Brawn   }
287*9e11a6d8SJohn Brawn   namespace D {
288*9e11a6d8SJohn Brawn     using B::X;
289*9e11a6d8SJohn Brawn     class X { };
290*9e11a6d8SJohn Brawn   }
291*9e11a6d8SJohn Brawn   using namespace C;
292*9e11a6d8SJohn Brawn   using namespace D;
f()293*9e11a6d8SJohn Brawn   void f() {
294*9e11a6d8SJohn Brawn     X(1);
295*9e11a6d8SJohn Brawn   }
296*9e11a6d8SJohn Brawn }
297*9e11a6d8SJohn Brawn 
298*9e11a6d8SJohn Brawn namespace Test6d {
299*9e11a6d8SJohn Brawn   namespace C {
300*9e11a6d8SJohn Brawn     using B::X;
301*9e11a6d8SJohn Brawn     class X { };
302*9e11a6d8SJohn Brawn   }
303*9e11a6d8SJohn Brawn   namespace D {
304*9e11a6d8SJohn Brawn     using B::X;
305*9e11a6d8SJohn Brawn     class X { };
306*9e11a6d8SJohn Brawn   }
307*9e11a6d8SJohn Brawn   using namespace D;
308*9e11a6d8SJohn Brawn   using namespace C;
f()309*9e11a6d8SJohn Brawn   void f() {
310*9e11a6d8SJohn Brawn     X(1);
311*9e11a6d8SJohn Brawn   }
312*9e11a6d8SJohn Brawn }
313*9e11a6d8SJohn Brawn 
314*9e11a6d8SJohn Brawn // function X inside C should hide class X in C but not D.
315*9e11a6d8SJohn Brawn namespace Test7a {
316*9e11a6d8SJohn Brawn   namespace C {
317*9e11a6d8SJohn Brawn     class X;
318*9e11a6d8SJohn Brawn     void X(int); // expected-note{{candidate found by name lookup is 'Test7a::C::X'}}
319*9e11a6d8SJohn Brawn   }
320*9e11a6d8SJohn Brawn   namespace D {
321*9e11a6d8SJohn Brawn     class X; // expected-note{{candidate found by name lookup is 'Test7a::D::X'}}
322*9e11a6d8SJohn Brawn   }
323*9e11a6d8SJohn Brawn   using namespace C;
324*9e11a6d8SJohn Brawn   using namespace D;
f()325*9e11a6d8SJohn Brawn   void f() {
326*9e11a6d8SJohn Brawn     X(1); // expected-error{{reference to 'X' is ambiguous}}
327*9e11a6d8SJohn Brawn   }
328*9e11a6d8SJohn Brawn }
329*9e11a6d8SJohn Brawn 
330*9e11a6d8SJohn Brawn namespace Test7b {
331*9e11a6d8SJohn Brawn   namespace C {
332*9e11a6d8SJohn Brawn     class X;
333*9e11a6d8SJohn Brawn     void X(int); // expected-note{{candidate found by name lookup is 'Test7b::C::X'}}
334*9e11a6d8SJohn Brawn   }
335*9e11a6d8SJohn Brawn   namespace D {
336*9e11a6d8SJohn Brawn     class X; // expected-note{{candidate found by name lookup is 'Test7b::D::X'}}
337*9e11a6d8SJohn Brawn   }
338*9e11a6d8SJohn Brawn   using namespace D;
339*9e11a6d8SJohn Brawn   using namespace C;
f()340*9e11a6d8SJohn Brawn   void f() {
341*9e11a6d8SJohn Brawn     X(1); // expected-error{{reference to 'X' is ambiguous}}
342*9e11a6d8SJohn Brawn   }
343*9e11a6d8SJohn Brawn }
344*9e11a6d8SJohn Brawn 
345*9e11a6d8SJohn Brawn namespace Test7c {
346*9e11a6d8SJohn Brawn   namespace C {
347*9e11a6d8SJohn Brawn     void X(int); // expected-note{{candidate found by name lookup is 'Test7c::C::X'}}
348*9e11a6d8SJohn Brawn     class X;
349*9e11a6d8SJohn Brawn   }
350*9e11a6d8SJohn Brawn   namespace D {
351*9e11a6d8SJohn Brawn     class X; // expected-note{{candidate found by name lookup is 'Test7c::D::X'}}
352*9e11a6d8SJohn Brawn   }
353*9e11a6d8SJohn Brawn   using namespace C;
354*9e11a6d8SJohn Brawn   using namespace D;
f()355*9e11a6d8SJohn Brawn   void f() {
356*9e11a6d8SJohn Brawn     X(1); // expected-error{{reference to 'X' is ambiguous}}
357*9e11a6d8SJohn Brawn   }
358*9e11a6d8SJohn Brawn }
359*9e11a6d8SJohn Brawn 
360*9e11a6d8SJohn Brawn namespace Test7d {
361*9e11a6d8SJohn Brawn   namespace C {
362*9e11a6d8SJohn Brawn     void X(int); // expected-note{{candidate found by name lookup is 'Test7d::C::X'}}
363*9e11a6d8SJohn Brawn     class X;
364*9e11a6d8SJohn Brawn   }
365*9e11a6d8SJohn Brawn   namespace D {
366*9e11a6d8SJohn Brawn     class X; // expected-note{{candidate found by name lookup is 'Test7d::D::X'}}
367*9e11a6d8SJohn Brawn   }
368*9e11a6d8SJohn Brawn   using namespace D;
369*9e11a6d8SJohn Brawn   using namespace C;
f()370*9e11a6d8SJohn Brawn   void f() {
371*9e11a6d8SJohn Brawn     X(1); // expected-error{{reference to 'X' is ambiguous}}
372*9e11a6d8SJohn Brawn   }
373*9e11a6d8SJohn Brawn }
374