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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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