// { dg-do run } extern "C" int printf(const char *,...); struct V1 { int v; virtual int foo(); V1(); ~V1(); }; struct V2 : virtual V1 { int v2; virtual int foo(); V2(); ~V2(); }; struct C : virtual V1, virtual V2 { int c; virtual int foo(); C(); ~C(); }; struct B { int b; }; struct D : B, C { int d; virtual int bar(); D(); ~D(); }; extern "C" int printf(const char *,...); int main(int argc, char**argv) { try { D *d = new D; delete d; } catch (int) { printf("Int caught\n"); } } int V1::foo() { printf("V1::foo called\n"); return 1; } V1::V1() : v(5) { printf("V1 called\n"); } V1::~V1() { printf("~V1 called\n"); } int V2::foo() { printf("V2::foo called\n"); return 1; } V2::V2() : v2(6) { printf("V2 called\n"); } V2::~V2() { printf("~V2 called\n"); } int C::foo() { printf("C::foo called %d\n", c); return 1; } C::C() : c(7) { printf("C called\n"); V1 *vv = this; vv->foo(); C *cp = dynamic_cast(vv); if (this == cp) { printf("PASSED this == cp\n"); } else { printf("FAILED this != cp\n"); } } C::~C() { printf("~C called\n"); V1 *vv = this; vv->foo(); C *cp = dynamic_cast(vv); if (this == cp) { printf("PASSED this == cp\n"); } else { printf("FAILED this != cp\n"); } } int D::bar() { printf("D::bar called\n"); return 1; } D::D() : d(8) { printf("D called\n"); throw 5; } D::~D() { printf("~D called\n"); }