1// RUN: %clang_cc1 -fsyntax-only -verify -Wno-unused-comparison %s
2
3// PR8439
4class A
5{
6};
7
8class B
9{
10public:
11  A & m;
12};
13
14class Base
15{
16public:
17  B &f();
18};
19
20class Derived1 : public Base { };
21
22class Derived2 : public Base { };
23
24class X : public B, public Derived2, public Derived1
25{
26public:
27  virtual void g();
28};
29
30void 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
37namespace 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
46namespace AddrOfMember {
47  struct A { int X; };
48  typedef int (A::*P);
49  template<typename T> struct S : T {
50    void f() {
51      P(&T::X) // expected-error {{cannot cast from type 'int *' to member pointer type 'P'}}
52          == &A::X;
53    }
54  };
55
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; };
61  void h() {
62    S<B>().f(); // expected-note {{here}}
63  }
64}
65