Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 namespace N { struct X { }; };
      4 
      5 namespace A = N;
      6 
      7 int B; // expected-note {{previous definition is here}}
      8 namespace B = N; // expected-error {{redefinition of 'B' as different kind of symbol}}
      9 
     10 namespace C { } // expected-note {{previous definition is here}}
     11 namespace C = N; // expected-error {{redefinition of 'C'}}
     12 
     13 int i;
     14 namespace D =
     15 i; // expected-error {{expected namespace name}}
     16 
     17 namespace E1 = N::
     18 Foo; // expected-error {{expected namespace name}}
     19 namespace E2 = N::
     20 X; // expected-error {{expected namespace name}}
     21 
     22 namespace F {
     23   namespace A { namespace B { } } // expected-note {{candidate found by name lookup is 'F::A::B'}}
     24   namespace B { } // expected-note {{candidate found by name lookup is 'F::B'}}
     25   using namespace A;
     26   namespace D = B; // expected-error {{reference to 'B' is ambiguous}}
     27 }
     28 
     29 namespace G {
     30   namespace B = N;
     31 }
     32 
     33 namespace H {
     34   namespace A1 { }
     35   namespace A2 { }
     36 
     37   // These all point to A1.
     38   namespace B = A1;
     39   namespace B = A1;
     40   namespace C = B;
     41   namespace B = C; // expected-note {{previously defined as an alias for 'A1'}}
     42 
     43   namespace B = A2; // expected-error {{redefinition of 'B' as an alias for a different namespace}}
     44 }
     45 
     46 namespace I {
     47   namespace A1 { int i; }
     48 
     49   namespace A2 = A1;
     50 }
     51 
     52 int f() {
     53   return I::A2::i;
     54 }
     55 
     56 namespace J {
     57   namespace A {
     58     namespace B { void func (); }
     59   }
     60 
     61   namespace C = A;
     62 
     63   using namespace C::B;
     64 
     65   void g() {
     66     func();
     67   }
     68 }
     69 
     70 namespace K {
     71   namespace KA { void func(); }
     72 
     73   void f() {
     74     namespace KB = KA;
     75     KB::func();
     76   }
     77 
     78   template <class T> void g() {
     79     namespace KC = KA;
     80     KC::func();
     81   }
     82   template void g<int>();
     83   template void g<long>();
     84 
     85   void h() {
     86     KB::func(); // expected-error {{undeclared identifier 'KB'}}
     87     KC::func(); // expected-error {{undeclared identifier 'KC'}}
     88   }
     89 }
     90 
     91 namespace {
     92   class C1;
     93 }
     94 namespace {
     95   class C1;
     96 }
     97 C1 *pc1 = 0;
     98 
     99 namespace N {
    100   namespace {
    101     class C2;
    102   }
    103 }
    104 namespace N {
    105   namespace {
    106     class C2;
    107   }
    108 }
    109 N::C2 *pc2 = 0;
    110 
    111 // PR6341
    112 namespace A = N;
    113 namespace N { }
    114 namespace A = N;
    115 
    116 A::X nx;
    117 
    118 namespace PR7014 {
    119   namespace X
    120   {
    121     namespace Y {}
    122   }
    123 
    124   using namespace X;
    125 
    126   namespace Y = X::Y;
    127 }
    128 
    129 namespace PR25731 {
    130   void f() {
    131     namespace X = PR25731;
    132     namespace X = PR25731;
    133     X::f();
    134   }
    135 }
    136 
    137 namespace MultipleUnambiguousLookupResults {
    138   namespace A { int y; }
    139   namespace B {
    140     namespace X { int x; }
    141     namespace Y = A;
    142     namespace Z = A; // expected-note {{candidate}}
    143   }
    144   namespace C {
    145     namespace X = B::X;
    146     namespace Y = A;
    147     namespace Z = X; // expected-note {{candidate}}
    148   }
    149   using namespace B;
    150   using namespace C;
    151   int x1 = X::x; // ok, unambiguous
    152   int y1 = Y::y; // ok, unambiguous
    153   int z1 = Z::x; // expected-error {{ambiguous}}
    154 
    155   namespace X = C::X;
    156   namespace Y = A;
    157   int x2 = X::x; // ok, unambiguous
    158   int y2 = Y::y; // ok, unambiguous
    159 }
    160 
    161 namespace RedeclOfNonNamespace {
    162   int a; // expected-note {{previous}}
    163   namespace X { int b; }
    164   using X::b; // expected-note {{previous}}
    165   namespace c {} // expected-note {{previous}}
    166 
    167   namespace a = X; // expected-error {{different kind}}
    168   namespace b = X; // expected-error {{different kind}}
    169   namespace c = X; // expected-error-re {{redefinition of 'c'{{$}}}}
    170 }
    171