// RUN: %clang_cc1 -fsyntax-only -verify %s // (this actually occurs before paragraph 1) namespace test0 { namespace A {} class B { using namespace A; // expected-error {{'using namespace' is not allowed in classes}} }; } struct opaque0 {}; struct opaque1 {}; // Test that names appear as if in deepest common ancestor. namespace test1 { namespace A { namespace B { opaque0 foo(); // expected-note {{candidate}} } } namespace C { opaque1 foo(); // expected-note {{candidate}} opaque1 test() { using namespace A::B; return foo(); // C::foo } } opaque1 test() { using namespace A::B; using namespace C; return foo(); // expected-error {{call to 'foo' is ambiguous}} } } // Same thing, but with the directives in namespaces. namespace test2 { namespace A { namespace B { opaque0 foo(); // expected-note {{candidate}} } } namespace C { opaque1 foo(); // expected-note {{candidate}} namespace test { using namespace A::B; opaque1 test() { return foo(); // C::foo } } } namespace test { using namespace A::B; using namespace C; opaque1 test() { return foo(); // expected-error {{call to 'foo' is ambiguous}} } } } // Transitivity. namespace test3 { namespace A { namespace B { opaque0 foo(); } } namespace C { using namespace A; } opaque0 test0() { using namespace C; using namespace B; return foo(); } namespace D { using namespace C; } namespace A { opaque1 foo(); } opaque1 test1() { using namespace D; return foo(); } } // Transitivity acts like synthetic using directives. namespace test4 { namespace A { namespace B { opaque0 foo(); // expected-note {{candidate}} } } namespace C { using namespace A::B; } opaque1 foo(); // expected-note {{candidate}} namespace A { namespace D { using namespace C; } opaque0 test() { using namespace D; return foo(); } } opaque0 test() { using namespace A::D; return foo(); // expected-error {{call to 'foo' is ambiguous}} } } // Bug: using directives should be followed when parsing default // arguments in scoped declarations. class test5 { int inc(int x); }; namespace Test5 { int default_x = 0; } using namespace Test5; int test5::inc(int x = default_x) { return x+1; }