summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.mike/p3708.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/p3708.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/p3708.C')
-rw-r--r--gcc/testsuite/g++.old-deja/g++.mike/p3708.C87
1 files changed, 87 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.mike/p3708.C b/gcc/testsuite/g++.old-deja/g++.mike/p3708.C
new file mode 100644
index 000000000..56e4bcbe2
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.mike/p3708.C
@@ -0,0 +1,87 @@
+// { 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)
+ printf("FAIL\n%x != %x\n", ptr, 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;
+}