1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li namespace N { struct X { }; }; 4*67e74705SXin Li 5*67e74705SXin Li namespace A = N; 6*67e74705SXin Li 7*67e74705SXin Li int B; // expected-note {{previous definition is here}} 8*67e74705SXin Li namespace B = N; // expected-error {{redefinition of 'B' as different kind of symbol}} 9*67e74705SXin Li 10*67e74705SXin Li namespace C { } // expected-note {{previous definition is here}} 11*67e74705SXin Li namespace C = N; // expected-error {{redefinition of 'C'}} 12*67e74705SXin Li 13*67e74705SXin Li int i; 14*67e74705SXin Li namespace D = 15*67e74705SXin Li i; // expected-error {{expected namespace name}} 16*67e74705SXin Li 17*67e74705SXin Li namespace E1 = N:: 18*67e74705SXin Li Foo; // expected-error {{expected namespace name}} 19*67e74705SXin Li namespace E2 = N:: 20*67e74705SXin Li X; // expected-error {{expected namespace name}} 21*67e74705SXin Li 22*67e74705SXin Li namespace F { 23*67e74705SXin Li namespace A { namespace B { } } // expected-note {{candidate found by name lookup is 'F::A::B'}} 24*67e74705SXin Li namespace B { } // expected-note {{candidate found by name lookup is 'F::B'}} 25*67e74705SXin Li using namespace A; 26*67e74705SXin Li namespace D = B; // expected-error {{reference to 'B' is ambiguous}} 27*67e74705SXin Li } 28*67e74705SXin Li 29*67e74705SXin Li namespace G { 30*67e74705SXin Li namespace B = N; 31*67e74705SXin Li } 32*67e74705SXin Li 33*67e74705SXin Li namespace H { 34*67e74705SXin Li namespace A1 { } 35*67e74705SXin Li namespace A2 { } 36*67e74705SXin Li 37*67e74705SXin Li // These all point to A1. 38*67e74705SXin Li namespace B = A1; 39*67e74705SXin Li namespace B = A1; 40*67e74705SXin Li namespace C = B; 41*67e74705SXin Li namespace B = C; // expected-note {{previously defined as an alias for 'A1'}} 42*67e74705SXin Li 43*67e74705SXin Li namespace B = A2; // expected-error {{redefinition of 'B' as an alias for a different namespace}} 44*67e74705SXin Li } 45*67e74705SXin Li 46*67e74705SXin Li namespace I { 47*67e74705SXin Li namespace A1 { int i; } 48*67e74705SXin Li 49*67e74705SXin Li namespace A2 = A1; 50*67e74705SXin Li } 51*67e74705SXin Li f()52*67e74705SXin Liint f() { 53*67e74705SXin Li return I::A2::i; 54*67e74705SXin Li } 55*67e74705SXin Li 56*67e74705SXin Li namespace J { 57*67e74705SXin Li namespace A { 58*67e74705SXin Li namespace B { void func (); } 59*67e74705SXin Li } 60*67e74705SXin Li 61*67e74705SXin Li namespace C = A; 62*67e74705SXin Li 63*67e74705SXin Li using namespace C::B; 64*67e74705SXin Li g()65*67e74705SXin Li void g() { 66*67e74705SXin Li func(); 67*67e74705SXin Li } 68*67e74705SXin Li } 69*67e74705SXin Li 70*67e74705SXin Li namespace K { 71*67e74705SXin Li namespace KA { void func(); } 72*67e74705SXin Li f()73*67e74705SXin Li void f() { 74*67e74705SXin Li namespace KB = KA; 75*67e74705SXin Li KB::func(); 76*67e74705SXin Li } 77*67e74705SXin Li g()78*67e74705SXin Li template <class T> void g() { 79*67e74705SXin Li namespace KC = KA; 80*67e74705SXin Li KC::func(); 81*67e74705SXin Li } 82*67e74705SXin Li template void g<int>(); 83*67e74705SXin Li template void g<long>(); 84*67e74705SXin Li h()85*67e74705SXin Li void h() { 86*67e74705SXin Li KB::func(); // expected-error {{undeclared identifier 'KB'}} 87*67e74705SXin Li KC::func(); // expected-error {{undeclared identifier 'KC'}} 88*67e74705SXin Li } 89*67e74705SXin Li } 90*67e74705SXin Li 91*67e74705SXin Li namespace { 92*67e74705SXin Li class C1; 93*67e74705SXin Li } 94*67e74705SXin Li namespace { 95*67e74705SXin Li class C1; 96*67e74705SXin Li } 97*67e74705SXin Li C1 *pc1 = 0; 98*67e74705SXin Li 99*67e74705SXin Li namespace N { 100*67e74705SXin Li namespace { 101*67e74705SXin Li class C2; 102*67e74705SXin Li } 103*67e74705SXin Li } 104*67e74705SXin Li namespace N { 105*67e74705SXin Li namespace { 106*67e74705SXin Li class C2; 107*67e74705SXin Li } 108*67e74705SXin Li } 109*67e74705SXin Li N::C2 *pc2 = 0; 110*67e74705SXin Li 111*67e74705SXin Li // PR6341 112*67e74705SXin Li namespace A = N; 113*67e74705SXin Li namespace N { } 114*67e74705SXin Li namespace A = N; 115*67e74705SXin Li 116*67e74705SXin Li A::X nx; 117*67e74705SXin Li 118*67e74705SXin Li namespace PR7014 { 119*67e74705SXin Li namespace X 120*67e74705SXin Li { 121*67e74705SXin Li namespace Y {} 122*67e74705SXin Li } 123*67e74705SXin Li 124*67e74705SXin Li using namespace X; 125*67e74705SXin Li 126*67e74705SXin Li namespace Y = X::Y; 127*67e74705SXin Li } 128*67e74705SXin Li 129*67e74705SXin Li namespace PR25731 { f()130*67e74705SXin Li void f() { 131*67e74705SXin Li namespace X = PR25731; 132*67e74705SXin Li namespace X = PR25731; 133*67e74705SXin Li X::f(); 134*67e74705SXin Li } 135*67e74705SXin Li } 136*67e74705SXin Li 137*67e74705SXin Li namespace MultipleUnambiguousLookupResults { 138*67e74705SXin Li namespace A { int y; } 139*67e74705SXin Li namespace B { 140*67e74705SXin Li namespace X { int x; } 141*67e74705SXin Li namespace Y = A; 142*67e74705SXin Li namespace Z = A; // expected-note {{candidate}} 143*67e74705SXin Li } 144*67e74705SXin Li namespace C { 145*67e74705SXin Li namespace X = B::X; 146*67e74705SXin Li namespace Y = A; 147*67e74705SXin Li namespace Z = X; // expected-note {{candidate}} 148*67e74705SXin Li } 149*67e74705SXin Li using namespace B; 150*67e74705SXin Li using namespace C; 151*67e74705SXin Li int x1 = X::x; // ok, unambiguous 152*67e74705SXin Li int y1 = Y::y; // ok, unambiguous 153*67e74705SXin Li int z1 = Z::x; // expected-error {{ambiguous}} 154*67e74705SXin Li 155*67e74705SXin Li namespace X = C::X; 156*67e74705SXin Li namespace Y = A; 157*67e74705SXin Li int x2 = X::x; // ok, unambiguous 158*67e74705SXin Li int y2 = Y::y; // ok, unambiguous 159*67e74705SXin Li } 160*67e74705SXin Li 161*67e74705SXin Li namespace RedeclOfNonNamespace { 162*67e74705SXin Li int a; // expected-note {{previous}} 163*67e74705SXin Li namespace X { int b; } 164*67e74705SXin Li using X::b; // expected-note {{previous}} 165*67e74705SXin Li namespace c {} // expected-note {{previous}} 166*67e74705SXin Li 167*67e74705SXin Li namespace a = X; // expected-error {{different kind}} 168*67e74705SXin Li namespace b = X; // expected-error {{different kind}} 169*67e74705SXin Li namespace c = X; // expected-error-re {{redefinition of 'c'{{$}}}} 170*67e74705SXin Li } 171