1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
28d7ba402ba062994e242c97719685d6d66a056ddAnders Carlsson
3c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregornamespace N { struct X { }; };
48d7ba402ba062994e242c97719685d6d66a056ddAnders Carlsson
58d7ba402ba062994e242c97719685d6d66a056ddAnders Carlssonnamespace A = N;
68d7ba402ba062994e242c97719685d6d66a056ddAnders Carlsson
78d7ba402ba062994e242c97719685d6d66a056ddAnders Carlssonint B; // expected-note {{previous definition is here}}
88d7ba402ba062994e242c97719685d6d66a056ddAnders Carlssonnamespace B = N; // expected-error {{redefinition of 'B' as different kind of symbol}}
98d7ba402ba062994e242c97719685d6d66a056ddAnders Carlsson
108d7ba402ba062994e242c97719685d6d66a056ddAnders Carlssonnamespace C { } // expected-note {{previous definition is here}}
118d7ba402ba062994e242c97719685d6d66a056ddAnders Carlssonnamespace C = N; // expected-error {{redefinition of 'C'}}
125721c68299edddd6d6dc32f6ea5441bcfa20dfd8Anders Carlsson
135721c68299edddd6d6dc32f6ea5441bcfa20dfd8Anders Carlssonint i;
14bf9658c3c200ee19bf0b6b157149f2376e39d270Richard Smithnamespace D =
15bf9658c3c200ee19bf0b6b157149f2376e39d270Richard Smithi; // expected-error {{expected namespace name}}
165721c68299edddd6d6dc32f6ea5441bcfa20dfd8Anders Carlsson
17bf9658c3c200ee19bf0b6b157149f2376e39d270Richard Smithnamespace E1 = N::
18bf9658c3c200ee19bf0b6b157149f2376e39d270Richard SmithFoo; // expected-error {{expected namespace name}}
19bf9658c3c200ee19bf0b6b157149f2376e39d270Richard Smithnamespace E2 = N::
20bf9658c3c200ee19bf0b6b157149f2376e39d270Richard SmithX; // expected-error {{expected namespace name}}
21a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlsson
22a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlssonnamespace F {
23a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlsson  namespace A { namespace B { } } // expected-note {{candidate found by name lookup is 'F::A::B'}}
24a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlsson  namespace B { } // expected-note {{candidate found by name lookup is 'F::B'}}
25a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlsson  using namespace A;
26a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlsson  namespace D = B; // expected-error {{reference to 'B' is ambiguous}}
27a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlsson}
28dd729fce03899ed03a212a49d7b03e043ce6ed40Anders Carlsson
29dd729fce03899ed03a212a49d7b03e043ce6ed40Anders Carlssonnamespace G {
30dd729fce03899ed03a212a49d7b03e043ce6ed40Anders Carlsson  namespace B = N;
31dd729fce03899ed03a212a49d7b03e043ce6ed40Anders Carlsson}
3281c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson
3381c85c421197a602523781a6ef730639c4c6ea51Anders Carlssonnamespace H {
3481c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace A1 { }
3581c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace A2 { }
3681c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson
3781c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  // These all point to A1.
3881c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace B = A1; // expected-note {{previous definition is here}}
3981c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace B = A1;
4081c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace C = B;
4181c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace B = C;
4281c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson
4381c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace B = A2; // expected-error {{redefinition of 'B' as different kind of symbol}}
4481c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson}
4581c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson
4681c85c421197a602523781a6ef730639c4c6ea51Anders Carlssonnamespace I {
4781c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace A1 { int i; }
4881c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson
4981c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace A2 = A1;
5081c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson}
5181c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson
5281c85c421197a602523781a6ef730639c4c6ea51Anders Carlssonint f() {
5381c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  return I::A2::i;
5481c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson}
55b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson
56b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlssonnamespace J {
57b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson  namespace A {
58b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson    namespace B { void func (); }
59b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson  }
60b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson
61b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson  namespace C = A;
62b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson
63b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson  using namespace C::B;
64b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson
65b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson  void g() {
66b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson    func();
67b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson  }
68b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson}
693dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall
703dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCallnamespace K {
713dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  namespace KA { void func(); }
723dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall
733dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  void f() {
743dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall    namespace KB = KA;
753dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall    KB::func();
763dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  }
773dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall
783dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  template <class T> void g() {
793dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall    namespace KC = KA;
803dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall    KC::func();
813dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  }
823dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  template void g<int>();
833dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  template void g<long>();
843dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall
853dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  void h() {
863dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall    KB::func(); // expected-error {{undeclared identifier 'KB'}}
873dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall    KC::func(); // expected-error {{undeclared identifier 'KC'}}
883dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  }
893dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall}
90c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregor
916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattnernamespace {
926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  class C1;
936ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
946ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattnernamespace {
956ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  class C1;
966ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
976ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris LattnerC1 *pc1 = 0;
986ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
996ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattnernamespace N {
1006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  namespace {
1016ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    class C2;
1026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  }
1036ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
1046ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattnernamespace N {
1056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  namespace {
1066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    class C2;
1076ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  }
1086ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
1096ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris LattnerN::C2 *pc2 = 0;
1106ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
111c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregor// PR6341
112c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregornamespace A = N;
113c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregornamespace N { }
114c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregornamespace A = N;
115c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregor
116c67b03260dbf4127e09b03302ff844a24e41394fDouglas GregorA::X nx;
117c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregor
118ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregornamespace PR7014 {
119ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor  namespace X
120ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor  {
121ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor    namespace Y {}
122ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor  }
123ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor
124ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor  using namespace X;
125ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor
126ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor  namespace Y = X::Y;
127ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor}
128