xref: /aosp_15_r20/external/clang/test/SemaCXX/using-directive.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li namespace A {
4*67e74705SXin Li   short i; // expected-note 2{{candidate found by name lookup is 'A::i'}}
5*67e74705SXin Li   namespace B {
6*67e74705SXin Li     long i; // expected-note{{candidate found by name lookup is 'A::B::i'}}
f()7*67e74705SXin Li     void f() {} // expected-note{{candidate function}}
8*67e74705SXin Li     int k;
9*67e74705SXin Li     namespace E {} // \
10*67e74705SXin Li       expected-note{{candidate found by name lookup is 'A::B::E'}}
11*67e74705SXin Li   }
12*67e74705SXin Li 
13*67e74705SXin Li   namespace E {} // expected-note{{candidate found by name lookup is 'A::E'}}
14*67e74705SXin Li 
15*67e74705SXin Li   namespace C {
16*67e74705SXin Li     using namespace B;
17*67e74705SXin Li     namespace E {} // \
18*67e74705SXin Li       expected-note{{candidate found by name lookup is 'A::C::E'}}
19*67e74705SXin Li   }
20*67e74705SXin Li 
f()21*67e74705SXin Li   void f() {} // expected-note{{candidate function}}
22*67e74705SXin Li 
23*67e74705SXin Li   class K1 {
24*67e74705SXin Li     void foo();
25*67e74705SXin Li   };
26*67e74705SXin Li 
local_i()27*67e74705SXin Li   void local_i() {
28*67e74705SXin Li     char i;
29*67e74705SXin Li     using namespace A;
30*67e74705SXin Li     using namespace B;
31*67e74705SXin Li     int a[sizeof(i) == sizeof(char)? 1 : -1]; // okay
32*67e74705SXin Li   }
33*67e74705SXin Li   namespace B {
34*67e74705SXin Li     int j;
35*67e74705SXin Li   }
36*67e74705SXin Li 
ambig_i()37*67e74705SXin Li   void ambig_i() {
38*67e74705SXin Li     using namespace A;
39*67e74705SXin Li     using namespace A::B;
40*67e74705SXin Li     (void) i; // expected-error{{reference to 'i' is ambiguous}}
41*67e74705SXin Li     f(); // expected-error{{call to 'f' is ambiguous}}
42*67e74705SXin Li     (void) j; // okay
43*67e74705SXin Li     using namespace C;
44*67e74705SXin Li     (void) k; // okay
45*67e74705SXin Li     using namespace E; // expected-error{{reference to 'E' is ambiguous}}
46*67e74705SXin Li   }
47*67e74705SXin Li 
48*67e74705SXin Li   struct K2 {}; // expected-note 2{{candidate found by name lookup is 'A::K2'}}
49*67e74705SXin Li }
50*67e74705SXin Li 
51*67e74705SXin Li struct K2 {}; // expected-note 2{{candidate found by name lookup is 'K2'}}
52*67e74705SXin Li 
53*67e74705SXin Li using namespace A;
54*67e74705SXin Li 
foo()55*67e74705SXin Li void K1::foo() {} // okay
56*67e74705SXin Li 
57*67e74705SXin Li struct K2 *k2; // expected-error{{reference to 'K2' is ambiguous}}
58*67e74705SXin Li 
59*67e74705SXin Li K2 *k3; // expected-error{{reference to 'K2' is ambiguous}}
60*67e74705SXin Li 
61*67e74705SXin Li class X { // expected-note{{candidate found by name lookup is 'X'}}
62*67e74705SXin Li   // FIXME: produce a suitable error message for this
63*67e74705SXin Li   using namespace A; // expected-error{{not allowed}}
64*67e74705SXin Li };
65*67e74705SXin Li 
66*67e74705SXin Li namespace N {
67*67e74705SXin Li   struct K2;
68*67e74705SXin Li   struct K2 { };
69*67e74705SXin Li }
70*67e74705SXin Li 
71*67e74705SXin Li namespace Ni {
72*67e74705SXin Li  int i(); // expected-note{{candidate found by name lookup is 'Ni::i'}}
73*67e74705SXin Li }
74*67e74705SXin Li 
75*67e74705SXin Li namespace NiTest {
76*67e74705SXin Li  using namespace A;
77*67e74705SXin Li  using namespace Ni;
78*67e74705SXin Li 
test()79*67e74705SXin Li  int test() {
80*67e74705SXin Li    return i; // expected-error{{reference to 'i' is ambiguous}}
81*67e74705SXin Li  }
82*67e74705SXin Li }
83*67e74705SXin Li 
84*67e74705SXin Li namespace OneTag {
85*67e74705SXin Li   struct X; // expected-note{{candidate found by name lookup is 'OneTag::X'}}
86*67e74705SXin Li }
87*67e74705SXin Li 
88*67e74705SXin Li namespace OneFunction {
89*67e74705SXin Li   void X(); // expected-note{{candidate found by name lookup is 'OneFunction::X'}}
90*67e74705SXin Li }
91*67e74705SXin Li 
92*67e74705SXin Li namespace TwoTag {
93*67e74705SXin Li   struct X; // expected-note{{candidate found by name lookup is 'TwoTag::X'}}
94*67e74705SXin Li }
95*67e74705SXin Li 
96*67e74705SXin Li namespace FuncHidesTagAmbiguity {
97*67e74705SXin Li   using namespace OneTag;
98*67e74705SXin Li   using namespace OneFunction;
99*67e74705SXin Li   using namespace TwoTag;
100*67e74705SXin Li 
test()101*67e74705SXin Li   void test() {
102*67e74705SXin Li     (void)X(); // expected-error{{reference to 'X' is ambiguous}}
103*67e74705SXin Li   }
104*67e74705SXin Li }
105*67e74705SXin Li 
106*67e74705SXin Li // PR5479
107*67e74705SXin Li namespace Aliased {
108*67e74705SXin Li   void inAliased();
109*67e74705SXin Li }
110*67e74705SXin Li namespace Alias = Aliased;
111*67e74705SXin Li using namespace Alias;
testAlias()112*67e74705SXin Li void testAlias() {
113*67e74705SXin Li   inAliased();
114*67e74705SXin Li }
115*67e74705SXin Li 
116*67e74705SXin Li namespace N { void f2(int); }
117*67e74705SXin Li 
118*67e74705SXin Li extern "C++" {
119*67e74705SXin Li   using namespace N;
f3()120*67e74705SXin Li   void f3() { f2(1); }
121*67e74705SXin Li }
122*67e74705SXin Li 
f4()123*67e74705SXin Li void f4() { f2(1); }
124*67e74705SXin Li 
125*67e74705SXin Li // PR7517
126*67e74705SXin Li using namespace std; // expected-warning{{using directive refers to implicitly-defined namespace 'std'}}
127*67e74705SXin Li using namespace ::std; // expected-warning{{using directive refers to implicitly-defined namespace 'std'}}
128*67e74705SXin Li 
129*67e74705SXin Li namespace test1 {
130*67e74705SXin Li   namespace ns { typedef int test1; }
131*67e74705SXin Li   template <class T> using namespace ns; // expected-error {{cannot template a using directive}}
132*67e74705SXin Li 
133*67e74705SXin Li   // Test that we recovered okay.
134*67e74705SXin Li   test1 x;
135*67e74705SXin Li }
136