136 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // 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;
 | |
| }
 | 
