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