178189Sbrian// { dg-do run } 278189Sbrian// Copyright (C) 2000 Free Software Foundation, Inc. 378189Sbrian// Contributed by Nathan Sidwell 19 Jan 2001 <nathan@codesourcery.com> 478189Sbrian 578189Sbrian// Bug 1701. building a vbase path was not using the shortest number of 66059Samurai// vbases. Normally that's just a pessimization, unfortunately during 778189Sbrian// constructoring it leads to uninitialized reads. 878189Sbrian 978189Sbrianextern "C" int printf (...); 1078189Sbrian 1178189Sbrianint fail = 0; 1278189Sbrian 1378189Sbrian/*{{{ struct Base*/ 1478189Sbrianstruct Base 156059Samurai{ 1678189Sbrian unsigned m; 1778189Sbrian static Base *addr; 1878189Sbrian 1978189Sbrian Base (); 2078189Sbrian virtual ~Base (); 2178189Sbrian}; 2278189Sbrian/*}}}*/ 2378189SbrianBase *Base::addr; 2478189Sbrian/*{{{ Base::Base ()*/ 2578189SbrianBase::Base () 2678189Sbrian{ 276059Samurai printf ("Base (%u) ctor %x\n", sizeof (Base), this); 2850479Speter if (fail) ; 296059Samurai else if (addr) 3078189Sbrian fail = 1; 3143313Sbrian else 3230715Sbrian addr = this; 3336285Sbrian} 3436285Sbrian/*}}}*/ 3581634Sbrian/*{{{ Base::~Base ()*/ 3636285SbrianBase::~Base () 3730715Sbrian{ 3843693Sbrian printf ("Base dtor %x\n", this); 3949472Sbrian if (fail) 4036285Sbrian ; 4130715Sbrian else if (this != addr) 4246686Sbrian fail = 2; 4330715Sbrian else 4430715Sbrian addr = 0; 4530715Sbrian} 4630715Sbrian/*}}}*/ 476059Samurai 4836285Sbrian/*{{{ struct M10 : virtual Base*/ 496059Samuraistruct M10 : virtual Base 5036285Sbrian{ 516059Samurai int m; 5263484Sbrian static M10 *addr; 5346686Sbrian 5436285Sbrian M10 (); 5536285Sbrian virtual ~M10 (); 5636285Sbrian}; 5736285Sbrian/*}}}*/ 5836285SbrianM10 *M10::addr; 5936285Sbrian/*{{{ M10::M10 ()*/ 6036285SbrianM10::M10 () 6136285Sbrian{ 6281634Sbrian printf ("M10 (%u) ctor %x\n", sizeof (M10), this); 6336285Sbrian if (fail) ; 6436285Sbrian else if (addr) 6536285Sbrian fail = 3; 6643313Sbrian else 6743313Sbrian addr = this; 6843313Sbrian} 6981634Sbrian/*}}}*/ 7081634Sbrian/*{{{ M10::~M10 ()*/ 7136285SbrianM10::~M10 () 7236285Sbrian{ 7336285Sbrian printf ("M10 dtor %x\n", this); 7438174Sbrian if (fail) 7536285Sbrian ; 766059Samurai else if (this != addr) 7755146Sbrian fail = 4; 7855146Sbrian else 7955146Sbrian addr = 0; 8043693Sbrian} 816059Samurai/*}}}*/ 8243693Sbrian 8343693Sbrian/*{{{ struct M4 : virtual Base, virtual M10*/ 846059Samuraistruct M4 : virtual Base, virtual M10 8543693Sbrian{ 866059Samurai int m; 876059Samurai static M4 *addr; 886059Samurai 896059Samurai M4 (); 906059Samurai virtual ~M4 (); 9143693Sbrian}; 9243693Sbrian/*}}}*/ 936059SamuraiM4 *M4::addr; 9443693Sbrian/*{{{ M4::M4 ()*/ 9543693SbrianM4::M4 () 9643693Sbrian{ 9737926Sbrian printf ("M4 (%u) ctor %x\n", sizeof (M4), this); 986059Samurai if (fail) ; 9943693Sbrian else if (addr) 1006059Samurai fail = 5; 10154912Sbrian else 10230715Sbrian addr = this; 1036059Samurai} 1046059Samurai/*}}}*/ 10543693Sbrian/*{{{ M4::~M4 ()*/ 1066059SamuraiM4::~M4 () 1076059Samurai{ 10843693Sbrian printf ("M4 dtor %x\n", this); 10950867Sbrian if (fail) 11050867Sbrian ; 1116059Samurai else if (this != addr) 1126059Samurai fail = 6; 1136059Samurai else 11443693Sbrian addr = 0; 1156059Samurai} 1166059Samurai/*}}}*/ 1176059Samurai 1186059Samurai/*{{{ struct M5 : M4*/ 1196059Samuraistruct M5 : M4 1206059Samurai{ 1216059Samurai int m; 12243693Sbrian static M5 *addr; 1236059Samurai 1246059Samurai M5 (); 1256059Samurai virtual ~M5 (); 12654912Sbrian}; 12730715Sbrian/*}}}*/ 1286059SamuraiM5 *M5::addr; 12953734Sbrian/*{{{ M5::M5 ()*/ 13053734SbrianM5::M5 () 13153734Sbrian{ 13253734Sbrian printf ("M5 (%u) ctor %x\n", sizeof (M5), this); 13353734Sbrian if (fail) ; 13453734Sbrian else if (addr) 13530715Sbrian fail = 7; 13637926Sbrian else 13743693Sbrian addr = this; 13846686Sbrian} 13950867Sbrian/*}}}*/ 1406059Samurai/*{{{ M5::~M5 ()*/ 1416059SamuraiM5::~M5 () 14243693Sbrian{ 14343693Sbrian printf ("M5 dtor %x\n", this); 1446059Samurai if (fail) 14596324Sbrian ; 14696324Sbrian else if (this != addr) 14743693Sbrian fail = 8; 14896324Sbrian else 14996324Sbrian addr = 0; 15096324Sbrian} 15196324Sbrian/*}}}*/ 15296324Sbrian 15396324Sbrian/*{{{ struct M9 : M5, virtual M10*/ 15443693Sbrianstruct M9 : M5, virtual M10 15596324Sbrian{ 15643693Sbrian int m; 1576059Samurai static M9 *addr; 15843693Sbrian 15943693Sbrian M9 (); 16043693Sbrian virtual ~M9 (); 16143693Sbrian}; 16243693Sbrian/*}}}*/ 16343693SbrianM9 *M9::addr; 16443693Sbrian/*{{{ M9::M9 ()*/ 16518752SjkhM9::M9 () 16643693Sbrian{ 16743693Sbrian printf ("M9 (%u), ctor %x\n", sizeof (M9), this); 16843693Sbrian if (fail) ; 16943693Sbrian else if (addr) 17043693Sbrian fail = 9; 1716059Samurai else 1726059Samurai addr = this; 1736059Samurai} 17443693Sbrian/*}}}*/ 1756059Samurai/*{{{ M9::~M9 ()*/ 17643693SbrianM9::~M9 () 17743693Sbrian{ 1786059Samurai printf ("M9 dtor %x\n", this); 17946686Sbrian if (fail) 18046686Sbrian ; 18143693Sbrian else if (this != addr) 18246686Sbrian fail = 10; 18343693Sbrian else 18443693Sbrian addr = 0; 18553734Sbrian} 18653734Sbrian/*}}}*/ 18736285Sbrian 18846686Sbrianint main () 18946686Sbrian{ 19054912Sbrian M9 *m9; 19146686Sbrian Base *r; 19246686Sbrian 19346686Sbrian m9 = new M9 (); 19446686Sbrian r = m9; 19546686Sbrian if (fail) 19645220Sbrian return fail; 19754912Sbrian void *top = dynamic_cast <void *> (r); 19846686Sbrian if (top != m9) 19945220Sbrian return 20; 20045220Sbrian r->~Base (); 20144159Sbrian 20244159Sbrian return fail; 20344159Sbrian} 20446686Sbrian