aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.mike/p10769a.C
blob: f5ff345a3fd36e3a03d5b1b1d019308561861e2a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// Special g++ Options: -Wno-pmf-conversions
// prms-id: 10769

#define PMF2PF(PMF) ((void (*)())(PMF))

int ok = 0;

class A {
public:
  void f1a() { ok += 3; }
  void f1b() { ok += 5; }
  void f2a() { ok += 7; }	// gets bogus error XFAIL *-*-*
  void f2b() { }
  const static void (*table[2][2])();
  void main();
} a;

const void (*A::table[2][2])()
  = { { PMF2PF(&A::f1a), PMF2PF(&A::f1b) },
      { PMF2PF(&A::f2a), PMF2PF(&A::f1b) },
  };

void
dispatch (A *obj, int i, int j)
{
  (*(void (*)(A *))A::table[i][j])(obj);
}

void A::main() {
  dispatch (&a, 0, 0);
  void (A::*mPtr)() = &A::f1a;

  (*(void (*)(A*))PMF2PF(mPtr))(&a);
  (*(void (*)(A*))PMF2PF(f2a))(&a); // gets bogus error XFAIL *-*-*
}

int main() {
  a.A::main();
  dispatch (&a, 0, 1);
  void (A::*mPtr)() = &A::f1b;

  (*(void (*)(A*))PMF2PF(a.*mPtr))(&a);
  (*(void (*)(A*))PMF2PF(a.f2a))(&a); // gets bogus error XFAIL *-*-*
  return ok != 3+3+5+5+7+7;
}