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 = i; // expected-error {{expected namespace name}}
15
16 namespace E = N::Foo; // expected-error {{expected namespace name}}
17
18 namespace F {
19 namespace A { namespace B { } } // expected-note {{candidate found by name lookup is 'F::A::B'}}
20 namespace B { } // expected-note {{candidate found by name lookup is 'F::B'}}
21 using namespace A;
22 namespace D = B; // expected-error {{reference to 'B' is ambiguous}}
23 }
24
25 namespace G {
26 namespace B = N;
27 }
28
29 namespace H {
30 namespace A1 { }
31 namespace A2 { }
32
33 // These all point to A1.
34 namespace B = A1; // expected-note {{previous definition is here}}
35 namespace B = A1;
36 namespace C = B;
37 namespace B = C;
38
39 namespace B = A2; // expected-error {{redefinition of 'B' as different kind of symbol}}
40 }
41
42 namespace I {
43 namespace A1 { int i; }
44
45 namespace A2 = A1;
46 }
47
f()48 int f() {
49 return I::A2::i;
50 }
51
52 namespace J {
53 namespace A {
54 namespace B { void func (); }
55 }
56
57 namespace C = A;
58
59 using namespace C::B;
60
g()61 void g() {
62 func();
63 }
64 }
65
66 namespace K {
67 namespace KA { void func(); }
68
f()69 void f() {
70 namespace KB = KA;
71 KB::func();
72 }
73
g()74 template <class T> void g() {
75 namespace KC = KA;
76 KC::func();
77 }
78 template void g<int>();
79 template void g<long>();
80
h()81 void h() {
82 KB::func(); // expected-error {{undeclared identifier 'KB'}}
83 KC::func(); // expected-error {{undeclared identifier 'KC'}}
84 }
85 }
86
87 namespace {
88 class C1;
89 }
90 namespace {
91 class C1;
92 }
93 C1 *pc1 = 0;
94
95 namespace N {
96 namespace {
97 class C2;
98 }
99 }
100 namespace N {
101 namespace {
102 class C2;
103 }
104 }
105 N::C2 *pc2 = 0;
106
107 // PR6341
108 namespace A = N;
109 namespace N { }
110 namespace A = N;
111
112 A::X nx;
113
114 namespace PR7014 {
115 namespace X
116 {
117 namespace Y {}
118 }
119
120 using namespace X;
121
122 namespace Y = X::Y;
123 }
124