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