blob: 9fcd922ddf7d4e42511b8affd7cbb841a10f6556 [file] [log] [blame]
Daniel Dunbard7d5f022009-03-24 02:24:46 +00001// RUN: clang-cc -fsyntax-only -verify %s
Douglas Gregor01beed02009-01-16 17:06:33 +00002struct A {
Douglas Gregor31a19b62009-04-01 21:51:26 +00003 int a; // expected-note 4{{member found by ambiguous name lookup}}
Douglas Gregor01beed02009-01-16 17:06:33 +00004 static int b;
Douglas Gregor31a19b62009-04-01 21:51:26 +00005 static int c; // expected-note 4{{member found by ambiguous name lookup}}
Douglas Gregor01beed02009-01-16 17:06:33 +00006
7 enum E { enumerator };
8
9 typedef int type;
10
11 static void f(int);
Douglas Gregor31a19b62009-04-01 21:51:26 +000012 void f(float); // expected-note 2{{member found by ambiguous name lookup}}
Douglas Gregor01beed02009-01-16 17:06:33 +000013
14 static void static_f(int);
15 static void static_f(double);
16};
17
18struct B : A {
Douglas Gregor31a19b62009-04-01 21:51:26 +000019 int d; // expected-note 2{{member found by ambiguous name lookup}}
Douglas Gregor01beed02009-01-16 17:06:33 +000020
21 enum E2 { enumerator2 };
22
Douglas Gregor31a19b62009-04-01 21:51:26 +000023 enum E3 { enumerator3 }; // expected-note 2{{member found by ambiguous name lookup}}
Douglas Gregor01beed02009-01-16 17:06:33 +000024};
25
26struct C : A {
Douglas Gregor31a19b62009-04-01 21:51:26 +000027 int c; // expected-note 2{{member found by ambiguous name lookup}}
28 int d; // expected-note 2{{member found by ambiguous name lookup}}
Douglas Gregor01beed02009-01-16 17:06:33 +000029
Douglas Gregor31a19b62009-04-01 21:51:26 +000030 enum E3 { enumerator3_2 }; // expected-note 2{{member found by ambiguous name lookup}}
Douglas Gregor01beed02009-01-16 17:06:33 +000031};
32
33struct D : B, C {
34 void test_lookup();
35};
36
37void test_lookup(D d) {
38 d.a; // expected-error{{non-static member 'a' found in multiple base-class subobjects of type 'struct A'}}
39 (void)d.b; // okay
40 d.c; // expected-error{{member 'c' found in multiple base classes of different types}}
41 d.d; // expected-error{{member 'd' found in multiple base classes of different types}}
42 d.f(0); // expected-error{{non-static member 'f' found in multiple base-class subobjects of type 'struct A'}}
43 d.static_f(0); // okay
44
45 D::E e = D::enumerator; // okay
46 D::type t = 0; // okay
47
48 D::E2 e2 = D::enumerator2; // okay
49
Douglas Gregor31a19b62009-04-01 21:51:26 +000050 D::E3 e3; // expected-error{{multiple base classes}}
Douglas Gregor01beed02009-01-16 17:06:33 +000051}
52
53void D::test_lookup() {
54 a; // expected-error{{non-static member 'a' found in multiple base-class subobjects of type 'struct A'}}
55 (void)b; // okay
56 c; // expected-error{{member 'c' found in multiple base classes of different types}}
57 d; // expected-error{{member 'd' found in multiple base classes of different types}}
58 f(0); // expected-error{{non-static member 'f' found in multiple base-class subobjects of type 'struct A'}}
59 static_f(0); // okay
60
Douglas Gregor66b947f2009-01-16 19:38:23 +000061 E e = enumerator; // okay
Douglas Gregor01beed02009-01-16 17:06:33 +000062 type t = 0; // okay
63
Douglas Gregor66b947f2009-01-16 19:38:23 +000064 E2 e2 = enumerator2; // okay
Douglas Gregor01beed02009-01-16 17:06:33 +000065
66 E3 e3; // expected-error{{member 'E3' found in multiple base classes of different types}}
67}
68
69struct B2 : virtual A {
Douglas Gregor31a19b62009-04-01 21:51:26 +000070 int d; // expected-note 2{{member found by ambiguous name lookup}}
Douglas Gregor01beed02009-01-16 17:06:33 +000071
72 enum E2 { enumerator2 };
73
Douglas Gregor31a19b62009-04-01 21:51:26 +000074 enum E3 { enumerator3 }; // expected-note 2 {{member found by ambiguous name lookup}}
Douglas Gregor01beed02009-01-16 17:06:33 +000075};
76
77struct C2 : virtual A {
Douglas Gregor31a19b62009-04-01 21:51:26 +000078 int c; // expected-note 2{{member found by ambiguous name lookup}}
79 int d; // expected-note 2{{member found by ambiguous name lookup}}
Douglas Gregor01beed02009-01-16 17:06:33 +000080
Douglas Gregor31a19b62009-04-01 21:51:26 +000081 enum E3 { enumerator3_2 }; // expected-note 2{{member found by ambiguous name lookup}}
Douglas Gregor01beed02009-01-16 17:06:33 +000082};
83
84struct D2 : B2, C2 {
85 void test_virtual_lookup();
86};
87
88struct F : A { };
89struct G : F, D2 {
90 void test_virtual_lookup();
91};
92
93void test_virtual_lookup(D2 d2, G g) {
94 (void)d2.a;
95 (void)d2.b;
96 d2.c; // expected-error{{member 'c' found in multiple base classes of different types}}
97 d2.d; // expected-error{{member 'd' found in multiple base classes of different types}}
98 d2.f(0); // okay
99 d2.static_f(0); // okay
100
101 D2::E e = D2::enumerator; // okay
102 D2::type t = 0; // okay
103
104 D2::E2 e2 = D2::enumerator2; // okay
105
106 D2::E3 e3; // expected-error{{member 'E3' found in multiple base classes of different types}}
107
108 g.a; // expected-error{{non-static member 'a' found in multiple base-class subobjects of type 'struct A'}}
109 g.static_f(0); // okay
110}
111
112void D2::test_virtual_lookup() {
113 (void)a;
114 (void)b;
115 c; // expected-error{{member 'c' found in multiple base classes of different types}}
116 d; // expected-error{{member 'd' found in multiple base classes of different types}}
117 f(0); // okay
118 static_f(0); // okay
119
120 E e = enumerator; // okay
121 type t = 0; // okay
122
123 E2 e2 = enumerator2; // okay
124
125 E3 e3; // expected-error{{member 'E3' found in multiple base classes of different types}}
126}
127
128void G::test_virtual_lookup() {
129 a; // expected-error{{non-static member 'a' found in multiple base-class subobjects of type 'struct A'}}
130 static_f(0); // okay
131}
Douglas Gregor2a3009a2009-02-03 19:21:40 +0000132
133
134struct HasMemberType1 {
Douglas Gregorb696ea32009-02-04 17:00:24 +0000135 struct type { }; // expected-note{{member found by ambiguous name lookup}}
Douglas Gregor2a3009a2009-02-03 19:21:40 +0000136};
137
138struct HasMemberType2 {
Douglas Gregorb696ea32009-02-04 17:00:24 +0000139 struct type { }; // expected-note{{member found by ambiguous name lookup}}
Douglas Gregor2a3009a2009-02-03 19:21:40 +0000140};
141
142struct HasAnotherMemberType : HasMemberType1, HasMemberType2 {
Douglas Gregore2c565d2009-02-03 19:26:08 +0000143 struct type { };
Douglas Gregor2a3009a2009-02-03 19:21:40 +0000144};
Douglas Gregorb696ea32009-02-04 17:00:24 +0000145
146struct UsesAmbigMemberType : HasMemberType1, HasMemberType2 {
Douglas Gregor31a19b62009-04-01 21:51:26 +0000147 type t; // expected-error{{member 'type' found in multiple base classes of different types}}
Douglas Gregorb696ea32009-02-04 17:00:24 +0000148};