blob: 3d22ff50dff4ac6068fd959f5dde3f014c1018db [file] [log] [blame]
// { dg-do run }
// Copyright (C) 2000 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 19 Jan 2001 <nathan@codesourcery.com>
// Bug 1701. building a vbase path was not using the shortest number of
// vbases. Normally that's just a pessimization, unfortunately during
// constructoring it leads to uninitialized reads.
extern "C" int printf (const char*,...);
int fail = 0;
/*{{{ struct Base*/
struct Base
{
unsigned m;
static Base *addr;
Base ();
virtual ~Base ();
};
/*}}}*/
Base *Base::addr;
/*{{{ Base::Base ()*/
Base::Base ()
{
printf ("Base (%u) ctor %x\n", sizeof (Base), this);
if (fail) ;
else if (addr)
fail = 1;
else
addr = this;
}
/*}}}*/
/*{{{ Base::~Base ()*/
Base::~Base ()
{
printf ("Base dtor %x\n", this);
if (fail)
;
else if (this != addr)
fail = 2;
else
addr = 0;
}
/*}}}*/
/*{{{ struct M10 : virtual Base*/
struct M10 : virtual Base
{
int m;
static M10 *addr;
M10 ();
virtual ~M10 ();
};
/*}}}*/
M10 *M10::addr;
/*{{{ M10::M10 ()*/
M10::M10 ()
{
printf ("M10 (%u) ctor %x\n", sizeof (M10), this);
if (fail) ;
else if (addr)
fail = 3;
else
addr = this;
}
/*}}}*/
/*{{{ M10::~M10 ()*/
M10::~M10 ()
{
printf ("M10 dtor %x\n", this);
if (fail)
;
else if (this != addr)
fail = 4;
else
addr = 0;
}
/*}}}*/
/*{{{ struct M4 : virtual Base, virtual M10*/
struct M4 : virtual Base, virtual M10
{
int m;
static M4 *addr;
M4 ();
virtual ~M4 ();
};
/*}}}*/
M4 *M4::addr;
/*{{{ M4::M4 ()*/
M4::M4 ()
{
printf ("M4 (%u) ctor %x\n", sizeof (M4), this);
if (fail) ;
else if (addr)
fail = 5;
else
addr = this;
}
/*}}}*/
/*{{{ M4::~M4 ()*/
M4::~M4 ()
{
printf ("M4 dtor %x\n", this);
if (fail)
;
else if (this != addr)
fail = 6;
else
addr = 0;
}
/*}}}*/
/*{{{ struct M5 : M4*/
struct M5 : M4
{
int m;
static M5 *addr;
M5 ();
virtual ~M5 ();
};
/*}}}*/
M5 *M5::addr;
/*{{{ M5::M5 ()*/
M5::M5 ()
{
printf ("M5 (%u) ctor %x\n", sizeof (M5), this);
if (fail) ;
else if (addr)
fail = 7;
else
addr = this;
}
/*}}}*/
/*{{{ M5::~M5 ()*/
M5::~M5 ()
{
printf ("M5 dtor %x\n", this);
if (fail)
;
else if (this != addr)
fail = 8;
else
addr = 0;
}
/*}}}*/
/*{{{ struct M9 : M5, virtual M10*/
struct M9 : M5, virtual M10
{
int m;
static M9 *addr;
M9 ();
virtual ~M9 ();
};
/*}}}*/
M9 *M9::addr;
/*{{{ M9::M9 ()*/
M9::M9 ()
{
printf ("M9 (%u), ctor %x\n", sizeof (M9), this);
if (fail) ;
else if (addr)
fail = 9;
else
addr = this;
}
/*}}}*/
/*{{{ M9::~M9 ()*/
M9::~M9 ()
{
printf ("M9 dtor %x\n", this);
if (fail)
;
else if (this != addr)
fail = 10;
else
addr = 0;
}
/*}}}*/
int main ()
{
M9 *m9;
Base *r;
m9 = new M9 ();
r = m9;
if (fail)
return fail;
void *top = dynamic_cast <void *> (r);
if (top != m9)
return 20;
r->~Base ();
return fail;
}