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