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 
9 struct A {
10   void f() &;
11   void g() &&;
12   void h();
13 };
14 
one()15 void 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 
39 template <class T>
40 struct B {
41   void f() &;
42   void g() &&;
43   void h();
44 };
45 
46 template <class T>
two()47 void 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 
main()71 int main()
72 {
73   one();
74   two<int>();
75 }
76