blob: dff53b5534e05f9e417e8c285489fe492f0096cf (
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
// { dg-do run }
// prms-id: 3708
extern "C" int printf (const char *, ...);
extern "C" int atoi (const char *);
void *ptr;
class A {
public:
A() { printf ("A is constructed.\n"); }
virtual void xx(int doit) { printf ("A is destructed.\n"); }
};
class A1 {
public:
A1() { printf ("A1 is constructed.\n"); }
virtual void xx(int doit) { printf ("A1 is destructed.\n"); }
};
class B : public A1, public virtual A {
public:
B() { printf ("B is constructed.\n"); }
virtual void xx(int doit) {
printf ("B is destructed.\n");
A1::xx (1);
if (doit) A::xx (1);
}
};
int num;
class C : public virtual A, public B {
public:
C() { ++num; printf ("C is constructed.\n");
ptr = this;
}
virtual void xx(int doit) {
--num;
if (ptr != this)
printf("FAIL\n%x != %x\n", ptr, this);
printf ("C is destructed.\n");
B::xx (0);
if (doit) A::xx (1);
}
};
void fooA(A *a) {
printf ("Casting to A!\n");
a->xx (1);
}
void fooA1(A1 *a) {
printf ("Casting to A1!\n");
a->xx (1);
}
void fooB(B *b) {
printf ("Casting to B!\n");
b->xx (1);
}
void fooC(C *c) {
printf ("Casting to C!\n");
c->xx (1);
}
int main(int argc, char *argv[]) {
printf ("*** Construct C object!\n");
C *c = new C();
int i = 0;
printf ("*** Try to delete the casting pointer!\n");
switch (i)
{
case 0: fooA1(c);
break;
case 1: fooA(c);
break;
case 2: fooB(c);
break;
case 3: fooC(c);
break;
}
return num!=0;
}
|