summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.robertl/eb17.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.old-deja/g++.robertl/eb17.C')
-rw-r--r--gcc/testsuite/g++.old-deja/g++.robertl/eb17.C59
1 files changed, 59 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/eb17.C b/gcc/testsuite/g++.old-deja/g++.robertl/eb17.C
new file mode 100644
index 000000000..4163399fb
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.robertl/eb17.C
@@ -0,0 +1,59 @@
+// { dg-do run }
+#include <stdio.h>
+
+class A {
+public:
+ virtual void print();
+ virtual A * clone();
+};
+
+struct Pad {
+ virtual void f () {}
+};
+
+class B : public Pad, virtual public A {
+public:
+ void print();
+ B * clone();
+};
+
+void A::print()
+{
+ printf("A\n");
+}
+
+void B::print()
+{
+ printf("B\n");
+}
+
+
+A * A::clone()
+{
+ return this;
+}
+
+B * B::clone()
+{
+ return this;
+}
+
+
+int main()
+{
+ A * a = new B;
+ B * b = dynamic_cast<B *>(a);
+
+ printf("%p\n",b); // (*2*)
+ b->print();
+
+ a = b;
+ printf("%p\n",a);
+ a->print();
+
+ a = a->clone();
+ printf("%p\n",a);
+ a->print(); // (*1*)
+
+ return 0;
+}