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