blob: 08352599bda8745a5955f6dab549f287e8278b62 [file] [log] [blame]
// 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;
}