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