1// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3namespace N { struct X { }; };
4
5namespace A = N;
6
7int B; // expected-note {{previous definition is here}}
8namespace B = N; // expected-error {{redefinition of 'B' as different kind of symbol}}
9
10namespace C { } // expected-note {{previous definition is here}}
11namespace C = N; // expected-error {{redefinition of 'C'}}
12
13int i;
14namespace D = i; // expected-error {{expected namespace name}}
15
16namespace E = N::Foo; // expected-error {{expected namespace name}}
17
18namespace 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
25namespace G {
26  namespace B = N;
27}
28
29namespace 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
42namespace I {
43  namespace A1 { int i; }
44
45  namespace A2 = A1;
46}
47
48int f() {
49  return I::A2::i;
50}
51
52namespace J {
53  namespace A {
54    namespace B { void func (); }
55  }
56
57  namespace C = A;
58
59  using namespace C::B;
60
61  void g() {
62    func();
63  }
64}
65
66namespace K {
67  namespace KA { void func(); }
68
69  void f() {
70    namespace KB = KA;
71    KB::func();
72  }
73
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
81  void h() {
82    KB::func(); // expected-error {{undeclared identifier 'KB'}}
83    KC::func(); // expected-error {{undeclared identifier 'KC'}}
84  }
85}
86
87namespace {
88  class C1;
89}
90namespace {
91  class C1;
92}
93C1 *pc1 = 0;
94
95namespace N {
96  namespace {
97    class C2;
98  }
99}
100namespace N {
101  namespace {
102    class C2;
103  }
104}
105N::C2 *pc2 = 0;
106
107// PR6341
108namespace A = N;
109namespace N { }
110namespace A = N;
111
112A::X nx;
113
114namespace PR7014 {
115  namespace X
116  {
117    namespace Y {}
118  }
119
120  using namespace X;
121
122  namespace Y = X::Y;
123}
124