diff options
Diffstat (limited to 'gcc/testsuite/g++.old-deja/g++.mike/virt5.C')
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.mike/virt5.C | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.mike/virt5.C b/gcc/testsuite/g++.old-deja/g++.mike/virt5.C new file mode 100644 index 000000000..cee8b3cb1 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.mike/virt5.C @@ -0,0 +1,54 @@ +// { 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; +} |