summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.mike/pmf2.C
blob: 209c5ebeaa13bce0d3728b2d806113752a9437eb (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
46
47
48
49
50
51
52
53
54
55
// { dg-do run  }
extern "C" int printf(const char *, ...);

class A_table {
  int c;
public:
  A_table() { c = 3;}
  virtual void func2(int &item) { printf("func2(%d,) c=%d\n",item,c);}
};

class B_table : private A_table {
public:
  typedef void (B_table::* B_ti_fn) (int &item);
  B_table() { j = 0x4321;}
  virtual void call_fn_fn1(int &item, void *pfn1);
  void func1(int &item) { printf("func1(%d)\n",item);}
  virtual void func2(int &item) { printf("func2(%d) j=%d\n",item,j);}
  int j;
};

class foo : public A_table {
public:
  int i;
  virtual ~foo();
  virtual void func2(int &item) { printf("func2(%d) i=%d\n",item,i);}
};
foo::~foo() { i = 0;}

class bar :public foo,public B_table {
public:
  int w;
  virtual ~bar();
  virtual void func2(int &item) { printf("func2(%d) w=%d\n",item,w);}
};
bar::~bar() { w = 0;}

void B_table::call_fn_fn1(int &item, void *pfn1) {
  (this->*(*(B_ti_fn*)pfn1))(item);
}

B_table b;
bar jar;

int main() {
  printf("ptr to B_table=%x, ptr to A_table=%x\n",&b,(A_table*)&b);
  B_table::B_ti_fn z = &B_table::func1;
  int j = 1;
  jar.call_fn_fn1(j,(void *)&z);
  j++;
  z = &B_table::func2;
  b.call_fn_fn1(j,(void *)&z);
  j++;
  jar.call_fn_fn1(j,(void *)&z);
  return 0;
}