1// { dg-do run  }
2// Copyright (C) 2000 Free Software Foundation, Inc.
3// Contributed by Nathan Sidwell 19 Jan 2001 <nathan@codesourcery.com>
4
5// Bug 1701. building a vbase path was not using the shortest number of
6// vbases. Normally that's just a pessimization, unfortunately during
7// constructoring it leads to uninitialized reads.
8
9extern "C" int printf (...);
10
11int fail = 0;
12
13/*{{{  struct Base*/
14struct Base
15{
16  unsigned m;
17  static Base *addr;
18
19  Base ();
20  virtual ~Base ();
21};
22/*}}}*/
23Base *Base::addr;
24/*{{{  Base::Base ()*/
25Base::Base ()
26{
27  printf ("Base (%u) ctor %x\n", sizeof (Base), this);
28  if (fail) ;
29  else if (addr)
30    fail = 1;
31  else
32    addr = this;
33}
34/*}}}*/
35/*{{{  Base::~Base ()*/
36Base::~Base ()
37{
38  printf ("Base dtor %x\n", this);
39  if (fail)
40    ;
41  else if (this != addr)
42    fail = 2;
43  else
44    addr = 0;
45}
46/*}}}*/
47
48/*{{{  struct M10 : virtual Base*/
49struct M10 : virtual Base
50{
51  int m;
52  static M10 *addr;
53
54  M10 ();
55  virtual ~M10 ();
56};
57/*}}}*/
58M10 *M10::addr;
59/*{{{  M10::M10 ()*/
60M10::M10 ()
61{
62  printf ("M10 (%u) ctor %x\n", sizeof (M10), this);
63  if (fail) ;
64  else if (addr)
65    fail = 3;
66  else
67    addr = this;
68}
69/*}}}*/
70/*{{{  M10::~M10 ()*/
71M10::~M10 ()
72{
73  printf ("M10 dtor %x\n", this);
74  if (fail)
75    ;
76  else if (this != addr)
77    fail = 4;
78  else
79    addr = 0;
80}
81/*}}}*/
82
83/*{{{  struct M4 : virtual Base, virtual M10*/
84struct M4 : virtual Base, virtual M10
85{
86  int m;
87  static M4 *addr;
88
89  M4 ();
90  virtual ~M4 ();
91};
92/*}}}*/
93M4 *M4::addr;
94/*{{{  M4::M4 ()*/
95M4::M4 ()
96{
97  printf ("M4 (%u) ctor %x\n", sizeof (M4), this);
98  if (fail) ;
99  else if (addr)
100    fail = 5;
101  else
102    addr = this;
103}
104/*}}}*/
105/*{{{  M4::~M4 ()*/
106M4::~M4 ()
107{
108  printf ("M4 dtor %x\n", this);
109  if (fail)
110    ;
111  else if (this != addr)
112    fail = 6;
113  else
114    addr = 0;
115}
116/*}}}*/
117
118/*{{{  struct M5 : M4*/
119struct M5 : M4
120{
121  int m;
122  static M5 *addr;
123
124  M5 ();
125  virtual ~M5 ();
126};
127/*}}}*/
128M5 *M5::addr;
129/*{{{  M5::M5 ()*/
130M5::M5 ()
131{
132  printf ("M5 (%u) ctor %x\n", sizeof (M5), this);
133  if (fail) ;
134  else if (addr)
135    fail = 7;
136  else
137    addr = this;
138}
139/*}}}*/
140/*{{{  M5::~M5 ()*/
141M5::~M5 ()
142{
143  printf ("M5 dtor %x\n", this);
144  if (fail)
145    ;
146  else if (this != addr)
147    fail = 8;
148  else
149    addr = 0;
150}
151/*}}}*/
152
153/*{{{  struct M9 : M5, virtual M10*/
154struct M9 : M5, virtual M10
155{
156  int m;
157  static M9 *addr;
158
159  M9 ();
160  virtual ~M9 ();
161};
162/*}}}*/
163M9 *M9::addr;
164/*{{{  M9::M9 ()*/
165M9::M9 ()
166{
167  printf ("M9 (%u), ctor %x\n", sizeof (M9), this);
168  if (fail) ;
169  else if (addr)
170    fail = 9;
171  else
172    addr = this;
173}
174/*}}}*/
175/*{{{  M9::~M9 ()*/
176M9::~M9 ()
177{
178  printf ("M9 dtor %x\n", this);
179  if (fail)
180    ;
181  else if (this != addr)
182    fail = 10;
183  else
184    addr = 0;
185}
186/*}}}*/
187
188int main ()
189{
190  M9 *m9;
191  Base *r;
192
193  m9 = new M9 ();
194  r = m9;
195  if (fail)
196    return fail;
197  void *top = dynamic_cast <void *> (r);
198  if (top != m9)
199    return 20;
200  r->~Base ();
201
202  return fail;
203}
204