From: Douglas Gregor Date: Fri, 16 Jan 2009 17:06:33 +0000 (+0000) Subject: Add test case for member name lookup X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=01beed0db79b6a1809955e61e7ac2c30c1a161a4;p=clang Add test case for member name lookup git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62324 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/SemaCXX/member-name-lookup.cpp b/test/SemaCXX/member-name-lookup.cpp new file mode 100644 index 0000000000..1eb83548c1 --- /dev/null +++ b/test/SemaCXX/member-name-lookup.cpp @@ -0,0 +1,132 @@ +// RUN: clang -fsyntax-only -verify %s + +struct A { + int a; // expected-note{{member found by ambiguous name lookup}} + static int b; + static int c; // expected-note{{member found by ambiguous name lookup}} + + enum E { enumerator }; + + typedef int type; + + static void f(int); + void f(float); // expected-note{{member found by ambiguous name lookup}} + + static void static_f(int); + static void static_f(double); +}; + +struct B : A { + int d; // expected-note{{member found by ambiguous name lookup}} + + enum E2 { enumerator2 }; + + enum E3 { enumerator3 }; // expected-note{{member found by ambiguous name lookup}} +}; + +struct C : A { + int c; // expected-note{{member found by ambiguous name lookup}} + int d; // expected-note{{member found by ambiguous name lookup}} + + enum E3 { enumerator3_2 }; // expected-note{{member found by ambiguous name lookup}} +}; + +struct D : B, C { + void test_lookup(); +}; + +void test_lookup(D d) { + d.a; // expected-error{{non-static member 'a' found in multiple base-class subobjects of type 'struct A'}} + (void)d.b; // okay + d.c; // expected-error{{member 'c' found in multiple base classes of different types}} + d.d; // expected-error{{member 'd' found in multiple base classes of different types}} + d.f(0); // expected-error{{non-static member 'f' found in multiple base-class subobjects of type 'struct A'}} + d.static_f(0); // okay + + D::E e = D::enumerator; // okay + D::type t = 0; // okay + + D::E2 e2 = D::enumerator2; // okay + + D::E3 e3; // expected-error{{member 'E3' found in multiple base classes of different types}} +} + +void D::test_lookup() { + a; // expected-error{{non-static member 'a' found in multiple base-class subobjects of type 'struct A'}} + (void)b; // okay + c; // expected-error{{member 'c' found in multiple base classes of different types}} + d; // expected-error{{member 'd' found in multiple base classes of different types}} + f(0); // expected-error{{non-static member 'f' found in multiple base-class subobjects of type 'struct A'}} + static_f(0); // okay + + // FIXME: should work E e = D::enumerator; // okay + type t = 0; // okay + + // FIXME: E2 e2 = D::enumerator2; // okay + + E3 e3; // expected-error{{member 'E3' found in multiple base classes of different types}} +} + +struct B2 : virtual A { + int d; // expected-note{{member found by ambiguous name lookup}} + + enum E2 { enumerator2 }; + + enum E3 { enumerator3 }; // expected-note{{member found by ambiguous name lookup}} +}; + +struct C2 : virtual A { + int c; // expected-note{{member found by ambiguous name lookup}} + int d; // expected-note{{member found by ambiguous name lookup}} + + enum E3 { enumerator3_2 }; // expected-note{{member found by ambiguous name lookup}} +}; + +struct D2 : B2, C2 { + void test_virtual_lookup(); +}; + +struct F : A { }; +struct G : F, D2 { + void test_virtual_lookup(); +}; + +void test_virtual_lookup(D2 d2, G g) { + (void)d2.a; + (void)d2.b; + d2.c; // expected-error{{member 'c' found in multiple base classes of different types}} + d2.d; // expected-error{{member 'd' found in multiple base classes of different types}} + d2.f(0); // okay + d2.static_f(0); // okay + + D2::E e = D2::enumerator; // okay + D2::type t = 0; // okay + + D2::E2 e2 = D2::enumerator2; // okay + + D2::E3 e3; // expected-error{{member 'E3' found in multiple base classes of different types}} + + g.a; // expected-error{{non-static member 'a' found in multiple base-class subobjects of type 'struct A'}} + g.static_f(0); // okay +} + +void D2::test_virtual_lookup() { + (void)a; + (void)b; + c; // expected-error{{member 'c' found in multiple base classes of different types}} + d; // expected-error{{member 'd' found in multiple base classes of different types}} + f(0); // okay + static_f(0); // okay + + E e = enumerator; // okay + type t = 0; // okay + + E2 e2 = enumerator2; // okay + + E3 e3; // expected-error{{member 'E3' found in multiple base classes of different types}} +} + +void G::test_virtual_lookup() { + a; // expected-error{{non-static member 'a' found in multiple base-class subobjects of type 'struct A'}} + static_f(0); // okay +}