xref: /aosp_15_r20/external/clang/test/SemaCXX/namespace-alias.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li namespace N { struct X { }; };
4*67e74705SXin Li 
5*67e74705SXin Li namespace A = N;
6*67e74705SXin Li 
7*67e74705SXin Li int B; // expected-note {{previous definition is here}}
8*67e74705SXin Li namespace B = N; // expected-error {{redefinition of 'B' as different kind of symbol}}
9*67e74705SXin Li 
10*67e74705SXin Li namespace C { } // expected-note {{previous definition is here}}
11*67e74705SXin Li namespace C = N; // expected-error {{redefinition of 'C'}}
12*67e74705SXin Li 
13*67e74705SXin Li int i;
14*67e74705SXin Li namespace D =
15*67e74705SXin Li i; // expected-error {{expected namespace name}}
16*67e74705SXin Li 
17*67e74705SXin Li namespace E1 = N::
18*67e74705SXin Li Foo; // expected-error {{expected namespace name}}
19*67e74705SXin Li namespace E2 = N::
20*67e74705SXin Li X; // expected-error {{expected namespace name}}
21*67e74705SXin Li 
22*67e74705SXin Li namespace F {
23*67e74705SXin Li   namespace A { namespace B { } } // expected-note {{candidate found by name lookup is 'F::A::B'}}
24*67e74705SXin Li   namespace B { } // expected-note {{candidate found by name lookup is 'F::B'}}
25*67e74705SXin Li   using namespace A;
26*67e74705SXin Li   namespace D = B; // expected-error {{reference to 'B' is ambiguous}}
27*67e74705SXin Li }
28*67e74705SXin Li 
29*67e74705SXin Li namespace G {
30*67e74705SXin Li   namespace B = N;
31*67e74705SXin Li }
32*67e74705SXin Li 
33*67e74705SXin Li namespace H {
34*67e74705SXin Li   namespace A1 { }
35*67e74705SXin Li   namespace A2 { }
36*67e74705SXin Li 
37*67e74705SXin Li   // These all point to A1.
38*67e74705SXin Li   namespace B = A1;
39*67e74705SXin Li   namespace B = A1;
40*67e74705SXin Li   namespace C = B;
41*67e74705SXin Li   namespace B = C; // expected-note {{previously defined as an alias for 'A1'}}
42*67e74705SXin Li 
43*67e74705SXin Li   namespace B = A2; // expected-error {{redefinition of 'B' as an alias for a different namespace}}
44*67e74705SXin Li }
45*67e74705SXin Li 
46*67e74705SXin Li namespace I {
47*67e74705SXin Li   namespace A1 { int i; }
48*67e74705SXin Li 
49*67e74705SXin Li   namespace A2 = A1;
50*67e74705SXin Li }
51*67e74705SXin Li 
f()52*67e74705SXin Li int f() {
53*67e74705SXin Li   return I::A2::i;
54*67e74705SXin Li }
55*67e74705SXin Li 
56*67e74705SXin Li namespace J {
57*67e74705SXin Li   namespace A {
58*67e74705SXin Li     namespace B { void func (); }
59*67e74705SXin Li   }
60*67e74705SXin Li 
61*67e74705SXin Li   namespace C = A;
62*67e74705SXin Li 
63*67e74705SXin Li   using namespace C::B;
64*67e74705SXin Li 
g()65*67e74705SXin Li   void g() {
66*67e74705SXin Li     func();
67*67e74705SXin Li   }
68*67e74705SXin Li }
69*67e74705SXin Li 
70*67e74705SXin Li namespace K {
71*67e74705SXin Li   namespace KA { void func(); }
72*67e74705SXin Li 
f()73*67e74705SXin Li   void f() {
74*67e74705SXin Li     namespace KB = KA;
75*67e74705SXin Li     KB::func();
76*67e74705SXin Li   }
77*67e74705SXin Li 
g()78*67e74705SXin Li   template <class T> void g() {
79*67e74705SXin Li     namespace KC = KA;
80*67e74705SXin Li     KC::func();
81*67e74705SXin Li   }
82*67e74705SXin Li   template void g<int>();
83*67e74705SXin Li   template void g<long>();
84*67e74705SXin Li 
h()85*67e74705SXin Li   void h() {
86*67e74705SXin Li     KB::func(); // expected-error {{undeclared identifier 'KB'}}
87*67e74705SXin Li     KC::func(); // expected-error {{undeclared identifier 'KC'}}
88*67e74705SXin Li   }
89*67e74705SXin Li }
90*67e74705SXin Li 
91*67e74705SXin Li namespace {
92*67e74705SXin Li   class C1;
93*67e74705SXin Li }
94*67e74705SXin Li namespace {
95*67e74705SXin Li   class C1;
96*67e74705SXin Li }
97*67e74705SXin Li C1 *pc1 = 0;
98*67e74705SXin Li 
99*67e74705SXin Li namespace N {
100*67e74705SXin Li   namespace {
101*67e74705SXin Li     class C2;
102*67e74705SXin Li   }
103*67e74705SXin Li }
104*67e74705SXin Li namespace N {
105*67e74705SXin Li   namespace {
106*67e74705SXin Li     class C2;
107*67e74705SXin Li   }
108*67e74705SXin Li }
109*67e74705SXin Li N::C2 *pc2 = 0;
110*67e74705SXin Li 
111*67e74705SXin Li // PR6341
112*67e74705SXin Li namespace A = N;
113*67e74705SXin Li namespace N { }
114*67e74705SXin Li namespace A = N;
115*67e74705SXin Li 
116*67e74705SXin Li A::X nx;
117*67e74705SXin Li 
118*67e74705SXin Li namespace PR7014 {
119*67e74705SXin Li   namespace X
120*67e74705SXin Li   {
121*67e74705SXin Li     namespace Y {}
122*67e74705SXin Li   }
123*67e74705SXin Li 
124*67e74705SXin Li   using namespace X;
125*67e74705SXin Li 
126*67e74705SXin Li   namespace Y = X::Y;
127*67e74705SXin Li }
128*67e74705SXin Li 
129*67e74705SXin Li namespace PR25731 {
f()130*67e74705SXin Li   void f() {
131*67e74705SXin Li     namespace X = PR25731;
132*67e74705SXin Li     namespace X = PR25731;
133*67e74705SXin Li     X::f();
134*67e74705SXin Li   }
135*67e74705SXin Li }
136*67e74705SXin Li 
137*67e74705SXin Li namespace MultipleUnambiguousLookupResults {
138*67e74705SXin Li   namespace A { int y; }
139*67e74705SXin Li   namespace B {
140*67e74705SXin Li     namespace X { int x; }
141*67e74705SXin Li     namespace Y = A;
142*67e74705SXin Li     namespace Z = A; // expected-note {{candidate}}
143*67e74705SXin Li   }
144*67e74705SXin Li   namespace C {
145*67e74705SXin Li     namespace X = B::X;
146*67e74705SXin Li     namespace Y = A;
147*67e74705SXin Li     namespace Z = X; // expected-note {{candidate}}
148*67e74705SXin Li   }
149*67e74705SXin Li   using namespace B;
150*67e74705SXin Li   using namespace C;
151*67e74705SXin Li   int x1 = X::x; // ok, unambiguous
152*67e74705SXin Li   int y1 = Y::y; // ok, unambiguous
153*67e74705SXin Li   int z1 = Z::x; // expected-error {{ambiguous}}
154*67e74705SXin Li 
155*67e74705SXin Li   namespace X = C::X;
156*67e74705SXin Li   namespace Y = A;
157*67e74705SXin Li   int x2 = X::x; // ok, unambiguous
158*67e74705SXin Li   int y2 = Y::y; // ok, unambiguous
159*67e74705SXin Li }
160*67e74705SXin Li 
161*67e74705SXin Li namespace RedeclOfNonNamespace {
162*67e74705SXin Li   int a; // expected-note {{previous}}
163*67e74705SXin Li   namespace X { int b; }
164*67e74705SXin Li   using X::b; // expected-note {{previous}}
165*67e74705SXin Li   namespace c {} // expected-note {{previous}}
166*67e74705SXin Li 
167*67e74705SXin Li   namespace a = X; // expected-error {{different kind}}
168*67e74705SXin Li   namespace b = X; // expected-error {{different kind}}
169*67e74705SXin Li   namespace c = X; // expected-error-re {{redefinition of 'c'{{$}}}}
170*67e74705SXin Li }
171