// { dg-do run  }
// prms-id: 3708

extern "C" int printf (const char *, ...);
extern "C" void exit(int);

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:
  C() { printf ("C is constructed.\n");
      }
  virtual void xx(int doit) {
    printf ("C is destructed.\n");
    if (doit) A::xx (1);
  }
};

class D : public C, public B {
public:
  D() { ++num; printf ("D is constructed.\n");
      ptr = this;
      }
  virtual void xx(int doit) {
    --num;
    if (ptr != this) {
      /* APPLE LOCAL default to Wformat-security 5764921 */
      printf("FAIL\n%p != %p\n", ptr, (void*)this);
      exit(1);
    }
    printf ("D is destructed.\n");
    C::xx (0);
    B::xx (0);
  }
};

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 D object!\n");
  D *d = new D();

  printf ("*** Try to delete the casting pointer!\n");
  fooA1(d);
  return num!=0;
}
