1 // { dg-do run }
2 // { dg-options "-Wno-pmf-conversions" }
3 // prms-id: 10769
4
5 #define PMF2PF(PMF) ((void (*)())(PMF))
6
7 int ok = 0;
8
9 class A {
10 public:
f1a()11 void f1a() { ok += 3; }
f1b()12 void f1b() { ok += 5; }
f2a()13 void f2a() { ok += 7; }
f2b()14 void f2b() { }
15 static void (*table[2][2])();
16 void main();
17 } a;
18
19 void (*A::table[2][2])()
20 = { { PMF2PF(&A::f1a), PMF2PF(&A::f1b) },
21 { PMF2PF(&A::f2a), PMF2PF(&A::f1b) },
22 };
23
24 void
dispatch(A * obj,int i,int j)25 dispatch (A *obj, int i, int j)
26 {
27 (*(void (*)(A *))A::table[i][j])(obj);
28 }
29
main()30 void A::main() {
31 dispatch (&a, 0, 0);
32 void (A::*mPtr)() = &A::f1a;
33
34 (*(void (*)(A*))PMF2PF(mPtr))(&a);
35 (*(void (*)(A*))PMF2PF(f2a))(&a); // { dg-bogus "" "" { xfail *-*-* } }
36 }
37
main()38 int main() {
39 a.A::main();
40 dispatch (&a, 0, 1);
41 void (A::*mPtr)() = &A::f1b;
42
43 (*(void (*)(A*))PMF2PF(a.*mPtr))(&a);
44 (*(void (*)(A*))PMF2PF(a.f2a))(&a); // { dg-bogus "" "" { xfail *-*-* } }
45 return ok != 3+3+5+5+7+7;
46 }
47