// RUN: clang-cc -fsyntax-only -verify %s
struct Y {
  int x;
};

template<typename T>
struct X1 {
  int f(T* ptr, int T::*pm) { // expected-error{{member pointer}}
    return ptr->*pm;
  }
};

template struct X1<Y>;
template struct X1<int>; // expected-note{{instantiation}}

template<typename T, typename Class>
struct X2 {
  T f(Class &obj, T Class::*pm) { // expected-error{{to a reference}} \
                      // expected-error{{member pointer to void}}
    return obj.*pm; 
  }
};

template struct X2<int, Y>;
template struct X2<int&, Y>; // expected-note{{instantiation}}
template struct X2<const void, Y>; // expected-note{{instantiation}}

template<typename T, typename Class, T Class::*Ptr>
struct X3 {
  X3<T, Class, Ptr> &operator=(const T& value) {
    return *this;
  }
};

X3<int, Y, &Y::x> x3;

typedef int Y::*IntMember;

template<IntMember Member>
struct X4 {
  X3<int, Y, Member> member;
  
  int &getMember(Y& y) { return y.*Member; }
};

int &get_X4(X4<&Y::x> x4, Y& y) { 
  return x4.getMember(y); 
}

template<IntMember Member>
void accept_X4(X4<Member>);

void test_accept_X4(X4<&Y::x> x4) {
  accept_X4(x4);
}
