| // 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; |
| } |