1// RUN: %clang_cc1 -fsyntax-only -verify %s 2struct A { 3 int a; // expected-note 4{{member found by ambiguous name lookup}} 4 static int b; 5 static int c; // expected-note 2{{member found by ambiguous name lookup}} 6 7 enum E { enumerator }; 8 9 typedef int type; 10 11 static void f(int); 12 void f(float); // expected-note 2{{member found by ambiguous name lookup}} 13 14 static void static_f(int); 15 static void static_f(double); 16}; 17 18struct B : A { 19 int d; // expected-note 2{{member found by ambiguous name lookup}} 20 21 enum E2 { enumerator2 }; 22 23 enum E3 { enumerator3 }; // expected-note 2{{member found by ambiguous name lookup}} 24}; 25 26struct C : A { 27 int c; // expected-note 2{{member found by ambiguous name lookup}} 28 int d; // expected-note 2{{member found by ambiguous name lookup}} 29 30 enum E3 { enumerator3_2 }; // expected-note 2{{member found by ambiguous name lookup}} 31}; 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 '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 '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 50 D::E3 e3; // expected-error{{multiple base classes}} 51} 52 53void D::test_lookup() { 54 a; // expected-error{{non-static member 'a' found in multiple base-class subobjects of type '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 'A':}} 59 static_f(0); // okay 60 61 E e = enumerator; // okay 62 type t = 0; // okay 63 64 E2 e2 = enumerator2; // okay 65 66 E3 e3; // expected-error{{member 'E3' found in multiple base classes of different types}} 67} 68 69struct B2 : virtual A { 70 int d; // expected-note 2{{member found by ambiguous name lookup}} 71 72 enum E2 { enumerator2 }; 73 74 enum E3 { enumerator3 }; // expected-note 2 {{member found by ambiguous name lookup}} 75}; 76 77struct C2 : virtual A { 78 int c; 79 int d; // expected-note 2{{member found by ambiguous name lookup}} 80 81 enum E3 { enumerator3_2 }; // expected-note 2{{member found by ambiguous name lookup}} 82}; 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 (void)d2.c; // okay 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 'A':}} 109 g.static_f(0); // okay 110} 111 112void D2::test_virtual_lookup() { 113 (void)a; 114 (void)b; 115 (void)c; // okay 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 'A':}} 130 static_f(0); // okay 131} 132 133 134struct HasMemberType1 { 135 struct type { }; // expected-note{{member found by ambiguous name lookup}} 136}; 137 138struct HasMemberType2 { 139 struct type { }; // expected-note{{member found by ambiguous name lookup}} 140}; 141 142struct HasAnotherMemberType : HasMemberType1, HasMemberType2 { 143 struct type { }; 144}; 145 146struct UsesAmbigMemberType : HasMemberType1, HasMemberType2 { 147 type t; // expected-error{{member 'type' found in multiple base classes of different types}} 148}; 149 150struct X0 { 151 struct Inner { 152 static const int m; 153 }; 154 155 static const int n = 17; 156}; 157 158const int X0::Inner::m = n; 159