// In a .* expression whose object expression is an rvalue, the program is // ill-formed if the second operand is a pointer to member function with // ref-qualifier &. In a .* expression whose object expression is an // lvalue, the program is ill-formed if the second operand is a pointer to // member function with ref-qualifier &&. // { dg-require-effective-target c++11 } struct A { void f() &; void g() &&; void h(); }; void one() { A a; void (A::*p)() & = &A::f; (a.*p)(); (A().*p)(); // { dg-error "" } p = &A::g; // { dg-error "" } p = &A::h; // { dg-error "" } void (A::*p2)() && = &A::g; (A().*p2)(); (a.*p2)(); // { dg-error "" } p2 = &A::f; // { dg-error "" } p2 = &A::h; // { dg-error "" } void (A::*p3)() = &A::h; (a.*p3)(); (A().*p3)(); p3 = &A::f; // { dg-error "" } p3 = &A::g; // { dg-error "" } } template struct B { void f() &; void g() &&; void h(); }; template void two() { B a; void (B::*p)() & = &B::f; (a.*p)(); (B().*p)(); // { dg-error "" } p = &B::g; // { dg-error "" } p = &B::h; // { dg-error "" } void (B::*p2)() && = &B::g; (B().*p2)(); (a.*p2)(); // { dg-error "" } p2 = &B::f; // { dg-error "" } p2 = &B::h; // { dg-error "" } void (B::*p3)() = &B::h; (a.*p3)(); (B().*p3)(); p3 = &B::f; // { dg-error "" } p3 = &B::g; // { dg-error "" } } int main() { one(); two(); }