namespace-alias.cpp revision c67b03260dbf4127e09b03302ff844a24e41394f
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
87c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregor// PR6341
88c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregornamespace A = N;
89c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregornamespace N { }
90c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregornamespace A = N;
91c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregor
92c67b03260dbf4127e09b03302ff844a24e41394fDouglas GregorA::X nx;
93c67b03260dbf4127e09b03302ff844a24e41394fDouglas Gregor
94