| // { 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 virtual A, public A1 { |
| 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; |
| } |