xref: /aosp_15_r20/external/clang/test/SemaCXX/qual-id-test.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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