Home | History | Annotate | Download | only in SemaTemplate
      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 
     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 {
     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