// { 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)
      /* APPLE LOCAL default to Wformat-security 5764921 */
      printf("FAIL\n%p != %p\n", ptr, (void*)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;
}
