member-access-ambig.cpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // RUN: %clang_cc1 -fsyntax-only -verify -Wno-unused-comparison %s
  2. // PR8439
  3. class A
  4. {
  5. };
  6. class B
  7. {
  8. public:
  9. A & m;
  10. };
  11. class Base
  12. {
  13. public:
  14. B &f();
  15. };
  16. class Derived1 : public Base { };
  17. class Derived2 : public Base { };
  18. class X : public B, public Derived2, public Derived1
  19. {
  20. public:
  21. virtual void g();
  22. };
  23. void X::g()
  24. {
  25. m.f<int>(); // expected-error{{no member named 'f' in 'A'}} \
  26. // expected-error{{expected '(' for function-style cast}} \
  27. // expected-error{{expected expression}}
  28. }
  29. namespace PR11134 {
  30. template<typename Derived> class A;
  31. template<typename Derived> class B : A<Derived> {
  32. typedef A<Derived> Base;
  33. using Base::member;
  34. int member;
  35. };
  36. }
  37. namespace AddrOfMember {
  38. struct A { int X; };
  39. typedef int (A::*P);
  40. template<typename T> struct S : T {
  41. void f() {
  42. P(&T::X) // expected-error {{cannot cast from type 'int *' to member pointer type 'P'}}
  43. == &A::X;
  44. }
  45. };
  46. void g() {
  47. S<A>().f(); // ok, &T::X is 'int (A::*)', not 'int *', even though T is a base class
  48. }
  49. struct B : A { static int X; };
  50. void h() {
  51. S<B>().f(); // expected-note {{here}}
  52. }
  53. }