annotate gcc/testsuite/g++.old-deja/g++.mike/p3708a.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // { dg-do run }
kono
parents:
diff changeset
2 // prms-id: 3708
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 extern "C" int printf (const char *, ...);
kono
parents:
diff changeset
5 extern "C" int atoi (const char *);
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 void *ptr;
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 class A {
kono
parents:
diff changeset
10 public:
kono
parents:
diff changeset
11 A() { printf ("A is constructed.\n"); }
kono
parents:
diff changeset
12 virtual void xx(int doit) { printf ("A is destructed.\n"); }
kono
parents:
diff changeset
13 };
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 class A1 {
kono
parents:
diff changeset
16 public:
kono
parents:
diff changeset
17 A1() { printf ("A1 is constructed.\n"); }
kono
parents:
diff changeset
18 virtual void xx(int doit) { printf ("A1 is destructed.\n"); }
kono
parents:
diff changeset
19 };
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 class B : public A1, public virtual A {
kono
parents:
diff changeset
22 public:
kono
parents:
diff changeset
23 B() { printf ("B is constructed.\n"); }
kono
parents:
diff changeset
24 virtual void xx(int doit) {
kono
parents:
diff changeset
25 printf ("B is destructed.\n");
kono
parents:
diff changeset
26 A1::xx (1);
kono
parents:
diff changeset
27 if (doit) A::xx (1);
kono
parents:
diff changeset
28 }
kono
parents:
diff changeset
29 };
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 int num;
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 class C : public virtual A, public B {
kono
parents:
diff changeset
34 public:
kono
parents:
diff changeset
35 C() { ++num; printf ("C is constructed.\n");
kono
parents:
diff changeset
36 ptr = this;
kono
parents:
diff changeset
37 }
kono
parents:
diff changeset
38 virtual void xx(int doit) {
kono
parents:
diff changeset
39 --num;
kono
parents:
diff changeset
40 if (ptr != this)
kono
parents:
diff changeset
41 printf("FAIL\n%x != %x\n", ptr, this);
kono
parents:
diff changeset
42 printf ("C is destructed.\n");
kono
parents:
diff changeset
43 B::xx (0);
kono
parents:
diff changeset
44 if (doit) A::xx (1);
kono
parents:
diff changeset
45 }
kono
parents:
diff changeset
46 };
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 void fooA(A *a) {
kono
parents:
diff changeset
49 printf ("Casting to A!\n");
kono
parents:
diff changeset
50 a->xx (1);
kono
parents:
diff changeset
51 }
kono
parents:
diff changeset
52 void fooA1(A1 *a) {
kono
parents:
diff changeset
53 printf ("Casting to A1!\n");
kono
parents:
diff changeset
54 a->xx (1);
kono
parents:
diff changeset
55 }
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 void fooB(B *b) {
kono
parents:
diff changeset
58 printf ("Casting to B!\n");
kono
parents:
diff changeset
59 b->xx (1);
kono
parents:
diff changeset
60 }
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 void fooC(C *c) {
kono
parents:
diff changeset
63 printf ("Casting to C!\n");
kono
parents:
diff changeset
64 c->xx (1);
kono
parents:
diff changeset
65 }
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 int main(int argc, char *argv[]) {
kono
parents:
diff changeset
68 printf ("*** Construct C object!\n");
kono
parents:
diff changeset
69 C *c = new C();
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 int i = 0;
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 printf ("*** Try to delete the casting pointer!\n");
kono
parents:
diff changeset
74 switch (i)
kono
parents:
diff changeset
75 {
kono
parents:
diff changeset
76 case 0: fooA1(c);
kono
parents:
diff changeset
77 break;
kono
parents:
diff changeset
78 case 1: fooA(c);
kono
parents:
diff changeset
79 break;
kono
parents:
diff changeset
80 case 2: fooB(c);
kono
parents:
diff changeset
81 break;
kono
parents:
diff changeset
82 case 3: fooC(c);
kono
parents:
diff changeset
83 break;
kono
parents:
diff changeset
84 }
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 return num!=0;
kono
parents:
diff changeset
87 }