1// In a .* expression whose object expression is an rvalue, the program is 2// ill-formed if the second operand is a pointer to member function with 3// ref-qualifier &. In a .* expression whose object expression is an 4// lvalue, the program is ill-formed if the second operand is a pointer to 5// member function with ref-qualifier &&. 6 7// { dg-require-effective-target c++11 } 8 9struct A { 10 void f() &; 11 void g() &&; 12 void h(); 13}; 14 15void one() 16{ 17 A a; 18 19 void (A::*p)() & = &A::f; 20 (a.*p)(); 21 (A().*p)(); // { dg-error "" } 22 23 p = &A::g; // { dg-error "" } 24 p = &A::h; // { dg-error "" } 25 26 void (A::*p2)() && = &A::g; 27 (A().*p2)(); 28 (a.*p2)(); // { dg-error "" } 29 p2 = &A::f; // { dg-error "" } 30 p2 = &A::h; // { dg-error "" } 31 32 void (A::*p3)() = &A::h; 33 (a.*p3)(); 34 (A().*p3)(); 35 p3 = &A::f; // { dg-error "" } 36 p3 = &A::g; // { dg-error "" } 37} 38 39template <class T> 40struct B { 41 void f() &; 42 void g() &&; 43 void h(); 44}; 45 46template <class T> 47void two() 48{ 49 B<T> a; 50 51 void (B<T>::*p)() & = &B<T>::f; 52 (a.*p)(); 53 (B<T>().*p)(); // { dg-error "" } 54 55 p = &B<T>::g; // { dg-error "" } 56 p = &B<T>::h; // { dg-error "" } 57 58 void (B<T>::*p2)() && = &B<T>::g; 59 (B<T>().*p2)(); 60 (a.*p2)(); // { dg-error "" } 61 p2 = &B<T>::f; // { dg-error "" } 62 p2 = &B<T>::h; // { dg-error "" } 63 64 void (B<T>::*p3)() = &B<T>::h; 65 (a.*p3)(); 66 (B<T>().*p3)(); 67 p3 = &B<T>::f; // { dg-error "" } 68 p3 = &B<T>::g; // { dg-error "" } 69} 70 71int main() 72{ 73 one(); 74 two<int>(); 75} 76