diff options
Diffstat (limited to 'gcc/testsuite/g++.old-deja/g++.robertl/eb17.C')
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.robertl/eb17.C | 59 |
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; +} |