xref: /aosp_15_r20/external/clang/test/SemaCXX/member-name-lookup.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li struct A {
3*67e74705SXin Li   int a;  // expected-note 4{{member found by ambiguous name lookup}}
4*67e74705SXin Li   static int b;
5*67e74705SXin Li   static int c; // expected-note 2{{member found by ambiguous name lookup}}
6*67e74705SXin Li 
7*67e74705SXin Li   enum E { enumerator };
8*67e74705SXin Li 
9*67e74705SXin Li   typedef int type;
10*67e74705SXin Li 
11*67e74705SXin Li   static void f(int);
12*67e74705SXin Li   void f(float); // expected-note 2{{member found by ambiguous name lookup}}
13*67e74705SXin Li 
14*67e74705SXin Li   static void static_f(int);
15*67e74705SXin Li   static void static_f(double);
16*67e74705SXin Li };
17*67e74705SXin Li 
18*67e74705SXin Li struct B : A {
19*67e74705SXin Li   int d; // expected-note 2{{member found by ambiguous name lookup}}
20*67e74705SXin Li 
21*67e74705SXin Li   enum E2 { enumerator2 };
22*67e74705SXin Li 
23*67e74705SXin Li   enum E3 { enumerator3 }; // expected-note 2{{member found by ambiguous name lookup}}
24*67e74705SXin Li };
25*67e74705SXin Li 
26*67e74705SXin Li struct C : A {
27*67e74705SXin Li   int c; // expected-note 2{{member found by ambiguous name lookup}}
28*67e74705SXin Li   int d; // expected-note 2{{member found by ambiguous name lookup}}
29*67e74705SXin Li 
30*67e74705SXin Li   enum E3 { enumerator3_2 }; // expected-note 2{{member found by ambiguous name lookup}}
31*67e74705SXin Li };
32*67e74705SXin Li 
33*67e74705SXin Li struct D : B, C {
34*67e74705SXin Li   void test_lookup();
35*67e74705SXin Li };
36*67e74705SXin Li 
test_lookup(D d)37*67e74705SXin Li void test_lookup(D d) {
38*67e74705SXin Li   d.a; // expected-error{{non-static member 'a' found in multiple base-class subobjects of type 'A':}}
39*67e74705SXin Li   (void)d.b; // okay
40*67e74705SXin Li   d.c; // expected-error{{member 'c' found in multiple base classes of different types}}
41*67e74705SXin Li   d.d; // expected-error{{member 'd' found in multiple base classes of different types}}
42*67e74705SXin Li   d.f(0); // expected-error{{non-static member 'f' found in multiple base-class subobjects of type 'A':}}
43*67e74705SXin Li   d.static_f(0); // okay
44*67e74705SXin Li 
45*67e74705SXin Li   D::E e = D::enumerator; // okay
46*67e74705SXin Li   D::type t = 0; // okay
47*67e74705SXin Li 
48*67e74705SXin Li   D::E2 e2 = D::enumerator2; // okay
49*67e74705SXin Li 
50*67e74705SXin Li   D::E3 e3; // expected-error{{multiple base classes}}
51*67e74705SXin Li }
52*67e74705SXin Li 
test_lookup()53*67e74705SXin Li void D::test_lookup() {
54*67e74705SXin Li   a; // expected-error{{non-static member 'a' found in multiple base-class subobjects of type 'A':}}
55*67e74705SXin Li   (void)b; // okay
56*67e74705SXin Li   c; // expected-error{{member 'c' found in multiple base classes of different types}}
57*67e74705SXin Li   d; // expected-error{{member 'd' found in multiple base classes of different types}}
58*67e74705SXin Li   f(0); // expected-error{{non-static member 'f' found in multiple base-class subobjects of type 'A':}}
59*67e74705SXin Li   static_f(0); // okay
60*67e74705SXin Li 
61*67e74705SXin Li   E e = enumerator; // okay
62*67e74705SXin Li   type t = 0; // okay
63*67e74705SXin Li 
64*67e74705SXin Li   E2 e2 = enumerator2; // okay
65*67e74705SXin Li 
66*67e74705SXin Li   E3 e3; // expected-error{{member 'E3' found in multiple base classes of different types}}
67*67e74705SXin Li }
68*67e74705SXin Li 
69*67e74705SXin Li struct B2 : virtual A {
70*67e74705SXin Li   int d; // expected-note 2{{member found by ambiguous name lookup}}
71*67e74705SXin Li 
72*67e74705SXin Li   enum E2 { enumerator2 };
73*67e74705SXin Li 
74*67e74705SXin Li   enum E3 { enumerator3 }; // expected-note 2 {{member found by ambiguous name lookup}}
75*67e74705SXin Li };
76*67e74705SXin Li 
77*67e74705SXin Li struct C2 : virtual A {
78*67e74705SXin Li   int c;
79*67e74705SXin Li   int d; // expected-note 2{{member found by ambiguous name lookup}}
80*67e74705SXin Li 
81*67e74705SXin Li   enum E3 { enumerator3_2 }; // expected-note 2{{member found by ambiguous name lookup}}
82*67e74705SXin Li };
83*67e74705SXin Li 
84*67e74705SXin Li struct D2 : B2, C2 {
85*67e74705SXin Li   void test_virtual_lookup();
86*67e74705SXin Li };
87*67e74705SXin Li 
88*67e74705SXin Li struct F : A { };
89*67e74705SXin Li struct G : F, D2 {
90*67e74705SXin Li   void test_virtual_lookup();
91*67e74705SXin Li };
92*67e74705SXin Li 
test_virtual_lookup(D2 d2,G g)93*67e74705SXin Li void test_virtual_lookup(D2 d2, G g) {
94*67e74705SXin Li   (void)d2.a;
95*67e74705SXin Li   (void)d2.b;
96*67e74705SXin Li   (void)d2.c; // okay
97*67e74705SXin Li   d2.d; // expected-error{{member 'd' found in multiple base classes of different types}}
98*67e74705SXin Li   d2.f(0); // okay
99*67e74705SXin Li   d2.static_f(0); // okay
100*67e74705SXin Li 
101*67e74705SXin Li   D2::E e = D2::enumerator; // okay
102*67e74705SXin Li   D2::type t = 0; // okay
103*67e74705SXin Li 
104*67e74705SXin Li   D2::E2 e2 = D2::enumerator2; // okay
105*67e74705SXin Li 
106*67e74705SXin Li   D2::E3 e3; // expected-error{{member 'E3' found in multiple base classes of different types}}
107*67e74705SXin Li 
108*67e74705SXin Li   g.a; // expected-error{{non-static member 'a' found in multiple base-class subobjects of type 'A':}}
109*67e74705SXin Li   g.static_f(0); // okay
110*67e74705SXin Li }
111*67e74705SXin Li 
test_virtual_lookup()112*67e74705SXin Li void D2::test_virtual_lookup() {
113*67e74705SXin Li   (void)a;
114*67e74705SXin Li   (void)b;
115*67e74705SXin Li   (void)c; // okay
116*67e74705SXin Li   d; // expected-error{{member 'd' found in multiple base classes of different types}}
117*67e74705SXin Li   f(0); // okay
118*67e74705SXin Li   static_f(0); // okay
119*67e74705SXin Li 
120*67e74705SXin Li   E e = enumerator; // okay
121*67e74705SXin Li   type t = 0; // okay
122*67e74705SXin Li 
123*67e74705SXin Li   E2 e2 = enumerator2; // okay
124*67e74705SXin Li 
125*67e74705SXin Li   E3 e3; // expected-error{{member 'E3' found in multiple base classes of different types}}
126*67e74705SXin Li }
127*67e74705SXin Li 
test_virtual_lookup()128*67e74705SXin Li void G::test_virtual_lookup() {
129*67e74705SXin Li   a; // expected-error{{non-static member 'a' found in multiple base-class subobjects of type 'A':}}
130*67e74705SXin Li   static_f(0); // okay
131*67e74705SXin Li }
132*67e74705SXin Li 
133*67e74705SXin Li 
134*67e74705SXin Li struct HasMemberType1 {
135*67e74705SXin Li   struct type { }; // expected-note{{member found by ambiguous name lookup}}
136*67e74705SXin Li };
137*67e74705SXin Li 
138*67e74705SXin Li struct HasMemberType2 {
139*67e74705SXin Li   struct type { }; // expected-note{{member found by ambiguous name lookup}}
140*67e74705SXin Li };
141*67e74705SXin Li 
142*67e74705SXin Li struct HasAnotherMemberType : HasMemberType1, HasMemberType2 {
143*67e74705SXin Li   struct type { };
144*67e74705SXin Li };
145*67e74705SXin Li 
146*67e74705SXin Li struct UsesAmbigMemberType : HasMemberType1, HasMemberType2 {
147*67e74705SXin Li   type t; // expected-error{{member 'type' found in multiple base classes of different types}}
148*67e74705SXin Li };
149*67e74705SXin Li 
150*67e74705SXin Li struct X0 {
151*67e74705SXin Li   struct Inner {
152*67e74705SXin Li     static const int m;
153*67e74705SXin Li   };
154*67e74705SXin Li 
155*67e74705SXin Li   static const int n = 17;
156*67e74705SXin Li };
157*67e74705SXin Li 
158*67e74705SXin Li const int X0::Inner::m = n;
159