summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.mike/virt5.C
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/g++.old-deja/g++.mike/virt5.C
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/g++.old-deja/g++.mike/virt5.C')
-rw-r--r--gcc/testsuite/g++.old-deja/g++.mike/virt5.C54
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;
+}