1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li namespace A { 4*67e74705SXin Li short i; // expected-note 2{{candidate found by name lookup is 'A::i'}} 5*67e74705SXin Li namespace B { 6*67e74705SXin Li long i; // expected-note{{candidate found by name lookup is 'A::B::i'}} f()7*67e74705SXin Li void f() {} // expected-note{{candidate function}} 8*67e74705SXin Li int k; 9*67e74705SXin Li namespace E {} // \ 10*67e74705SXin Li expected-note{{candidate found by name lookup is 'A::B::E'}} 11*67e74705SXin Li } 12*67e74705SXin Li 13*67e74705SXin Li namespace E {} // expected-note{{candidate found by name lookup is 'A::E'}} 14*67e74705SXin Li 15*67e74705SXin Li namespace C { 16*67e74705SXin Li using namespace B; 17*67e74705SXin Li namespace E {} // \ 18*67e74705SXin Li expected-note{{candidate found by name lookup is 'A::C::E'}} 19*67e74705SXin Li } 20*67e74705SXin Li f()21*67e74705SXin Li void f() {} // expected-note{{candidate function}} 22*67e74705SXin Li 23*67e74705SXin Li class K1 { 24*67e74705SXin Li void foo(); 25*67e74705SXin Li }; 26*67e74705SXin Li local_i()27*67e74705SXin Li void local_i() { 28*67e74705SXin Li char i; 29*67e74705SXin Li using namespace A; 30*67e74705SXin Li using namespace B; 31*67e74705SXin Li int a[sizeof(i) == sizeof(char)? 1 : -1]; // okay 32*67e74705SXin Li } 33*67e74705SXin Li namespace B { 34*67e74705SXin Li int j; 35*67e74705SXin Li } 36*67e74705SXin Li ambig_i()37*67e74705SXin Li void ambig_i() { 38*67e74705SXin Li using namespace A; 39*67e74705SXin Li using namespace A::B; 40*67e74705SXin Li (void) i; // expected-error{{reference to 'i' is ambiguous}} 41*67e74705SXin Li f(); // expected-error{{call to 'f' is ambiguous}} 42*67e74705SXin Li (void) j; // okay 43*67e74705SXin Li using namespace C; 44*67e74705SXin Li (void) k; // okay 45*67e74705SXin Li using namespace E; // expected-error{{reference to 'E' is ambiguous}} 46*67e74705SXin Li } 47*67e74705SXin Li 48*67e74705SXin Li struct K2 {}; // expected-note 2{{candidate found by name lookup is 'A::K2'}} 49*67e74705SXin Li } 50*67e74705SXin Li 51*67e74705SXin Li struct K2 {}; // expected-note 2{{candidate found by name lookup is 'K2'}} 52*67e74705SXin Li 53*67e74705SXin Li using namespace A; 54*67e74705SXin Li foo()55*67e74705SXin Livoid K1::foo() {} // okay 56*67e74705SXin Li 57*67e74705SXin Li struct K2 *k2; // expected-error{{reference to 'K2' is ambiguous}} 58*67e74705SXin Li 59*67e74705SXin Li K2 *k3; // expected-error{{reference to 'K2' is ambiguous}} 60*67e74705SXin Li 61*67e74705SXin Li class X { // expected-note{{candidate found by name lookup is 'X'}} 62*67e74705SXin Li // FIXME: produce a suitable error message for this 63*67e74705SXin Li using namespace A; // expected-error{{not allowed}} 64*67e74705SXin Li }; 65*67e74705SXin Li 66*67e74705SXin Li namespace N { 67*67e74705SXin Li struct K2; 68*67e74705SXin Li struct K2 { }; 69*67e74705SXin Li } 70*67e74705SXin Li 71*67e74705SXin Li namespace Ni { 72*67e74705SXin Li int i(); // expected-note{{candidate found by name lookup is 'Ni::i'}} 73*67e74705SXin Li } 74*67e74705SXin Li 75*67e74705SXin Li namespace NiTest { 76*67e74705SXin Li using namespace A; 77*67e74705SXin Li using namespace Ni; 78*67e74705SXin Li test()79*67e74705SXin Li int test() { 80*67e74705SXin Li return i; // expected-error{{reference to 'i' is ambiguous}} 81*67e74705SXin Li } 82*67e74705SXin Li } 83*67e74705SXin Li 84*67e74705SXin Li namespace OneTag { 85*67e74705SXin Li struct X; // expected-note{{candidate found by name lookup is 'OneTag::X'}} 86*67e74705SXin Li } 87*67e74705SXin Li 88*67e74705SXin Li namespace OneFunction { 89*67e74705SXin Li void X(); // expected-note{{candidate found by name lookup is 'OneFunction::X'}} 90*67e74705SXin Li } 91*67e74705SXin Li 92*67e74705SXin Li namespace TwoTag { 93*67e74705SXin Li struct X; // expected-note{{candidate found by name lookup is 'TwoTag::X'}} 94*67e74705SXin Li } 95*67e74705SXin Li 96*67e74705SXin Li namespace FuncHidesTagAmbiguity { 97*67e74705SXin Li using namespace OneTag; 98*67e74705SXin Li using namespace OneFunction; 99*67e74705SXin Li using namespace TwoTag; 100*67e74705SXin Li test()101*67e74705SXin Li void test() { 102*67e74705SXin Li (void)X(); // expected-error{{reference to 'X' is ambiguous}} 103*67e74705SXin Li } 104*67e74705SXin Li } 105*67e74705SXin Li 106*67e74705SXin Li // PR5479 107*67e74705SXin Li namespace Aliased { 108*67e74705SXin Li void inAliased(); 109*67e74705SXin Li } 110*67e74705SXin Li namespace Alias = Aliased; 111*67e74705SXin Li using namespace Alias; testAlias()112*67e74705SXin Livoid testAlias() { 113*67e74705SXin Li inAliased(); 114*67e74705SXin Li } 115*67e74705SXin Li 116*67e74705SXin Li namespace N { void f2(int); } 117*67e74705SXin Li 118*67e74705SXin Li extern "C++" { 119*67e74705SXin Li using namespace N; f3()120*67e74705SXin Li void f3() { f2(1); } 121*67e74705SXin Li } 122*67e74705SXin Li f4()123*67e74705SXin Livoid f4() { f2(1); } 124*67e74705SXin Li 125*67e74705SXin Li // PR7517 126*67e74705SXin Li using namespace std; // expected-warning{{using directive refers to implicitly-defined namespace 'std'}} 127*67e74705SXin Li using namespace ::std; // expected-warning{{using directive refers to implicitly-defined namespace 'std'}} 128*67e74705SXin Li 129*67e74705SXin Li namespace test1 { 130*67e74705SXin Li namespace ns { typedef int test1; } 131*67e74705SXin Li template <class T> using namespace ns; // expected-error {{cannot template a using directive}} 132*67e74705SXin Li 133*67e74705SXin Li // Test that we recovered okay. 134*67e74705SXin Li test1 x; 135*67e74705SXin Li } 136