Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
      3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
      4 
      5 namespace A
      6 {
      7     namespace B
      8     {
      9         struct base
     10 #if __cplusplus <= 199711L
     11         // expected-note@-2 {{lookup in the object type 'A::sub' refers here}}
     12 #endif
     13         {
     14             void x() {}
     15             void y() {}
     16         };
     17     }
     18 
     19     struct member
     20     {
     21         void foo();
     22     };
     23 
     24     struct middleman
     25     {
     26         member * operator->() { return 0; }
     27     };
     28 
     29     struct sub : B::base
     30     {
     31         void x() {}
     32         middleman operator->() { return middleman(); }
     33     };
     34 }
     35 
     36 struct bad
     37 {
     38   int x();
     39 };
     40 
     41 namespace C
     42 {
     43     void fun()
     44     {
     45         A::sub a;
     46 
     47         a.x();
     48 
     49         a.sub::x();
     50         a.base::x();
     51 
     52         a.B::base::x(); // expected-error{{use of undeclared identifier 'B'}}
     53 
     54         a.A::sub::x();
     55         a.A::B::base::x();
     56 
     57         a.bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}
     58 
     59         a->foo();
     60         a->member::foo();
     61         a->A::member::foo();
     62     }
     63 
     64     void fun2()
     65     {
     66         A::sub *a;
     67 
     68         a->x();
     69 
     70         a->sub::x();
     71         a->base::x();
     72 
     73         a->B::base::x(); // expected-error{{use of undeclared identifier 'B'}}
     74 
     75         a->A::sub::x();
     76         a->A::B::base::x();
     77 
     78         a->bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}
     79 
     80         (*a)->foo();
     81         (*a)->member::foo();
     82         (*a)->A::member::foo();
     83     }
     84 
     85     void fun3()
     86     {
     87         int i;
     88         i.foo(); // expected-error{{member reference base type 'int' is not a structure or union}}
     89     }
     90 
     91     void fun4a() {
     92       A::sub *a;
     93 
     94       typedef A::member base;
     95 #if __cplusplus <= 199711L
     96       // expected-note@-2 {{lookup from the current scope refers here}}
     97 #endif
     98       a->base::x();
     99 #if __cplusplus <= 199711L
    100       // expected-error@-2 {{lookup of 'base' in member access expression is ambiguous}}
    101 #endif
    102     }
    103 
    104     void fun4b() {
    105       A::sub *a;
    106 
    107       typedef A::B::base base;
    108       a->base::x();
    109     }
    110 
    111     template<typename T>
    112     void fun5()
    113     {
    114         T a;
    115         a.x();
    116         a->foo();
    117 
    118         a.A::sub::x();
    119         a.A::B::base::x();
    120         a->A::member::foo();
    121 
    122         a.bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}
    123     }
    124 
    125   void test_fun5() {
    126     fun5<A::sub>(); // expected-note{{instantiation}}
    127   }
    128 
    129   template<typename T>
    130   void fun6() {
    131     T a;
    132     a.sub::x();
    133     a.base::x();
    134     a->member::foo();
    135     a.B::base::x(); // expected-error{{use of undeclared identifier 'B'}}
    136    }
    137 
    138   void test_fun6() {
    139     fun6<A::sub>(); // expected-note{{instantiation}}
    140   }
    141 
    142 }
    143 
    144 // PR4703
    145 struct a {
    146   int a;
    147   static int sa;
    148 };
    149 
    150 a a;
    151 
    152 int a::sa = a.a; // expected-error {{invalid use of non-static data member 'a'}}
    153 
    154 
    155 namespace PR6645 {
    156   typedef int foo;
    157   namespace Inner {
    158     typedef int PR6645::foo; // expected-error{{typedef declarator cannot be qualified}} \
    159     // expected-error{{cannot define or redeclare 'foo' here because namespace 'Inner' does not enclose namespace 'PR6645'}}
    160   }
    161 }
    162