76 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s2struct Y {3 int x;4};5 6template<typename T>7struct X1 {8 int f(T* ptr, int T::*pm) {9 // expected-error@-1 {{type 'int' cannot be used prior to '::' because it has no members}}10 return ptr->*pm;11 }12};13 14template struct X1<Y>;15template struct X1<int>; // expected-note{{instantiation}}16 17template<typename T, typename Class>18struct X2 {19 T f(Class &obj, T Class::*pm) { // expected-error{{to a reference}} \20 // expected-error{{member pointer to void}}21 return obj.*pm; 22 }23};24 25template struct X2<int, Y>;26template struct X2<int&, Y>; // expected-note{{instantiation}}27template struct X2<const void, Y>; // expected-note{{instantiation}}28 29template<typename T, typename Class, T Class::*Ptr>30struct X3 {31 X3<T, Class, Ptr> &operator=(const T& value) {32 return *this;33 }34};35 36X3<int, Y, &Y::x> x3;37 38typedef int Y::*IntMember;39 40template<IntMember Member>41struct X4 {42 X3<int, Y, Member> member;43 44 int &getMember(Y& y) { return y.*Member; }45};46 47int &get_X4(X4<&Y::x> x4, Y& y) { 48 return x4.getMember(y); 49}50 51template<IntMember Member>52void accept_X4(X4<Member>);53 54void test_accept_X4(X4<&Y::x> x4) {55 accept_X4(x4);56}57 58namespace ValueDepMemberPointer {59 template <void (*)()> struct instantiate_function {};60 template <typename T> struct S {61 static void instantiate();62 typedef instantiate_function<&S::instantiate> x; // expected-note{{instantiation}}63 };64 template <typename T> void S<T>::instantiate() {65 int a[(int)sizeof(T)-42]; // expected-error{{array with a negative size}}66 }67 S<int> s; 68}69 70namespace PR18192 {71 struct A { struct { int n; }; };72 template<int A::*> struct X {};73 constexpr int A::*p = &A::n;74 X<p> x; // expected-error{{not a pointer to member constant}}75}76