namespace-alias.cpp revision 6ad9ac097918fbdeb443ea7b99d4db9e49b28534
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;
145721c68299edddd6d6dc32f6ea5441bcfa20dfd8Anders Carlssonnamespace D = i; // expected-error {{expected namespace name}}
155721c68299edddd6d6dc32f6ea5441bcfa20dfd8Anders Carlsson
165721c68299edddd6d6dc32f6ea5441bcfa20dfd8Anders Carlssonnamespace E = N::Foo; // expected-error {{expected namespace name}}
17a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlsson
18a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlssonnamespace F {
19a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlsson  namespace A { namespace B { } } // expected-note {{candidate found by name lookup is 'F::A::B'}}
20a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlsson  namespace B { } // expected-note {{candidate found by name lookup is 'F::B'}}
21a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlsson  using namespace A;
22a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlsson  namespace D = B; // expected-error {{reference to 'B' is ambiguous}}
23a1a1b306946e5730f7a47f7be920061cfd7e7259Anders Carlsson}
24dd729fce03899ed03a212a49d7b03e043ce6ed40Anders Carlsson
25dd729fce03899ed03a212a49d7b03e043ce6ed40Anders Carlssonnamespace G {
26dd729fce03899ed03a212a49d7b03e043ce6ed40Anders Carlsson  namespace B = N;
27dd729fce03899ed03a212a49d7b03e043ce6ed40Anders Carlsson}
2881c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson
2981c85c421197a602523781a6ef730639c4c6ea51Anders Carlssonnamespace H {
3081c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace A1 { }
3181c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace A2 { }
3281c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson
3381c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  // These all point to A1.
3481c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace B = A1; // expected-note {{previous definition is here}}
3581c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace B = A1;
3681c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace C = B;
3781c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace B = C;
3881c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson
3981c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace B = A2; // expected-error {{redefinition of 'B' as different kind of symbol}}
4081c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson}
4181c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson
4281c85c421197a602523781a6ef730639c4c6ea51Anders Carlssonnamespace I {
4381c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace A1 { int i; }
4481c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson
4581c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  namespace A2 = A1;
4681c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson}
4781c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson
4881c85c421197a602523781a6ef730639c4c6ea51Anders Carlssonint f() {
4981c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson  return I::A2::i;
5081c85c421197a602523781a6ef730639c4c6ea51Anders Carlsson}
51b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson
52b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlssonnamespace J {
53b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson  namespace A {
54b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson    namespace B { void func (); }
55b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson  }
56b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson
57b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson  namespace C = A;
58b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson
59b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson  using namespace C::B;
60b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson
61b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson  void g() {
62b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson    func();
63b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson  }
64b73e75cfda58c89e6cb196668409daa3c7e45d7fAnders Carlsson}
653dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall
663dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCallnamespace K {
673dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  namespace KA { void func(); }
683dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall
693dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  void f() {
703dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall    namespace KB = KA;
713dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall    KB::func();
723dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  }
733dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall
743dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  template <class T> void g() {
753dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall    namespace KC = KA;
763dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall    KC::func();
773dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  }
783dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  template void g<int>();
793dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  template void g<long>();
803dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall
813dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  void h() {
823dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall    KB::func(); // expected-error {{undeclared identifier 'KB'}}
833dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall    KC::func(); // expected-error {{undeclared identifier 'KC'}}
843dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall  }
853dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall}
86c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregor
876ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattnernamespace {
886ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  class C1;
896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
906ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattnernamespace {
916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  class C1;
926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
936ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris LattnerC1 *pc1 = 0;
946ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
956ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattnernamespace N {
966ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  namespace {
976ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    class C2;
986ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  }
996ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
1006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattnernamespace N {
1016ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  namespace {
1026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    class C2;
1036ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  }
1046ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
1056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris LattnerN::C2 *pc2 = 0;
1066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
107c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregor// PR6341
108c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregornamespace A = N;
109c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregornamespace N { }
110c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregornamespace A = N;
111c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregor
112c67b03260dbf4127e09b03302ff844a24e41394fDouglas GregorA::X nx;
113c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregor
114ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregornamespace PR7014 {
115ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor  namespace X
116ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor  {
117ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor    namespace Y {}
118ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor  }
119ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor
120ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor  using namespace X;
121ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor
122ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor  namespace Y = X::Y;
123ae374759fce6c74d5be29dfe058d4a727154115cDouglas Gregor}
124