| // This testcase used to crash while looking in A for my_module. I'm still |
| // not sure it's well-formed, but it works now because of the optimization |
| // to look at the expected address first. |
| |
| // { dg-do run } |
| |
| extern "C" int puts (const char *); |
| extern "C" void abort (); |
| |
| struct my_object |
| { |
| my_object() { puts ("in my_object ctor");} |
| virtual ~my_object() { puts ("in my_object dtor"); } |
| }; |
| |
| my_object* my_module_ptr = 0; |
| |
| struct my_module : my_object |
| { |
| my_module() |
| { |
| puts ("in my_module ctor, setting up ptr"); |
| my_module_ptr = this; |
| } |
| ~my_module() { puts ("in my_module dtor");} |
| }; |
| |
| struct D |
| { |
| D() { puts ("in D ctor"); } |
| virtual ~D(); |
| }; |
| |
| D::~D() |
| { |
| puts ("in D dtor"); |
| puts ("before DCASTing to my_module*"); |
| my_module* m = dynamic_cast<my_module*>(my_module_ptr); |
| if (m != my_module_ptr) |
| abort (); |
| puts ("after DCASTing to my_module*"); |
| } |
| |
| struct my_interface |
| { |
| my_interface() { puts ("in my_interface ctor");} |
| ~my_interface() { puts ("in my_interface dtor");} |
| }; |
| |
| struct myif : virtual my_interface |
| { |
| myif() { puts ("in myif ctor");} |
| ~myif() { puts ("in myif dtor");} |
| }; |
| |
| struct A: virtual myif |
| { |
| A() { puts ("in A ctor"); } |
| ~A() { puts ("in A dtor"); } |
| |
| D d; |
| }; |
| |
| struct B: virtual myif |
| { |
| B() { puts ("in B ctor"); } |
| ~B() { puts ("in B dtor"); } |
| |
| D d; |
| }; |
| |
| struct C : my_module, A, B |
| { |
| C() { puts ("in C ctor");} |
| ~C() { puts ("in C dtor"); } |
| }; |
| |
| int main(int, char**) |
| { |
| C t; |
| } |