// { dg-do run } // Ensure that virtual base upcast and downcasting works on this // conversions during virtual function dispatch at ctor/dtor time // when dynamic vtable fixups for deltas are needed. int fail = 0; struct BASE1 { virtual ~BASE1 () { } }; class MID; class BASE2 { public: virtual MID *VFN (){ return 0; } }; class MIBASE : public BASE1, public BASE2 { }; class VBB : public MIBASE { public: virtual long get_STATE () const = 0; void print_STATE() { if (get_STATE () != 87654321) fail = 1; } }; class VBD : public virtual VBB { long STATE; public: long get_STATE() const { return STATE; } VBD() { STATE = 87654321; } ~VBD() { STATE = 87654321; } }; class MID : public virtual VBD { public: MID () { print_STATE(); } ~MID () { print_STATE(); } virtual MID *VFN() { return this; } }; class LAST : public MID { public: LAST () { print_STATE(); } ~LAST () { print_STATE(); } }; int main() { MIBASE *o = new LAST; MID *p = o->VFN(); p->print_STATE(); delete o; return fail; }