// RUN: %clang_cc1 -fsyntax-only -verify %s namespace A { short i; // expected-note 2{{candidate found by name lookup is 'A::i'}} namespace B { long i; // expected-note{{candidate found by name lookup is 'A::B::i'}} void f() {} // expected-note{{candidate function}} int k; namespace E {} // \ expected-note{{candidate found by name lookup is 'A::B::E'}} } namespace E {} // expected-note{{candidate found by name lookup is 'A::E'}} namespace C { using namespace B; namespace E {} // \ expected-note{{candidate found by name lookup is 'A::C::E'}} } void f() {} // expected-note{{candidate function}} class K1 { void foo(); }; void local_i() { char i; using namespace A; using namespace B; int a[sizeof(i) == sizeof(char)? 1 : -1]; // okay } namespace B { int j; } void ambig_i() { using namespace A; using namespace A::B; (void) i; // expected-error{{reference to 'i' is ambiguous}} f(); // expected-error{{call to 'f' is ambiguous}} (void) j; // okay using namespace C; (void) k; // okay using namespace E; // expected-error{{reference to 'E' is ambiguous}} } struct K2 {}; // expected-note 2{{candidate found by name lookup is 'A::K2'}} } struct K2 {}; // expected-note 2{{candidate found by name lookup is 'K2'}} using namespace A; void K1::foo() {} // okay struct K2 *k2; // expected-error{{reference to 'K2' is ambiguous}} K2 *k3; // expected-error{{reference to 'K2' is ambiguous}} class X { // expected-note{{candidate found by name lookup is 'X'}} // FIXME: produce a suitable error message for this using namespace A; // expected-error{{not allowed}} }; namespace N { struct K2; struct K2 { }; } namespace Ni { int i(); // expected-note{{candidate found by name lookup is 'Ni::i'}} } namespace NiTest { using namespace A; using namespace Ni; int test() { return i; // expected-error{{reference to 'i' is ambiguous}} } } namespace OneTag { struct X; // expected-note{{candidate found by name lookup is 'OneTag::X'}} } namespace OneFunction { void X(); // expected-note{{candidate found by name lookup is 'OneFunction::X'}} } namespace TwoTag { struct X; // expected-note{{candidate found by name lookup is 'TwoTag::X'}} } namespace FuncHidesTagAmbiguity { using namespace OneTag; using namespace OneFunction; using namespace TwoTag; void test() { (void)X(); // expected-error{{reference to 'X' is ambiguous}} } } // PR5479 namespace Aliased { void inAliased(); } namespace Alias = Aliased; using namespace Alias; void testAlias() { inAliased(); } namespace N { void f2(int); } extern "C++" { using namespace N; void f3() { f2(1); } } void f4() { f2(1); } // PR7517 using namespace std; // expected-warning{{using directive refers to implicitly-defined namespace 'std'}} using namespace ::std; // expected-warning{{using directive refers to implicitly-defined namespace 'std'}} namespace test1 { namespace ns { typedef int test1; } template <class T> using namespace ns; // expected-error {{cannot template a using directive}} // Test that we recovered okay. test1 x; }