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