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