1// { dg-do compile }
2// { dg-options "-ftree-vrp -fno-guess-branch-probability -fnon-call-exceptions" }
3
4void *xalloc ();
5void xfree (void *);
6void error ();
7
8static inline void *
9MallocT ()
10{
11  void *p = xalloc ();
12  if (!p)
13    error ();
14  return p;
15}
16
17
18struct ByteBlob
19{
20  int *header;
21
22  ByteBlob();
23
24  ~ByteBlob ()
25  {
26    Free ();
27  }
28
29  int RawFree (int * p)
30  {
31    if (!p)
32      error ();
33    xfree (p);
34  }
35
36  int *LengthRef ();
37
38  void Free ()
39  {
40    if (*header)
41      RawFree (header);
42  }
43
44  int Append (int num_ints)
45  {
46    if (*header)
47      MallocT ();
48    *LengthRef () += num_ints;
49  }
50};
51
52struct CBlobT:ByteBlob
53{
54  ~CBlobT ()
55  {
56    Free ();
57  }
58};
59
60template < class T > struct FixedSizeArray
61{
62  int HeaderSize;
63  T *data;
64  FixedSizeArray ();
65  int RefCnt ()
66  {
67    return *(int *) MallocT ();
68  }
69   ~FixedSizeArray ()
70  {
71    if (RefCnt ())
72      for (T * pItem = data + Length (); pItem != data; pItem--)
73	T ();
74  }
75  int Length ();
76};
77
78class SmallArray
79{
80  typedef FixedSizeArray < int > SubArray;
81  typedef FixedSizeArray < SubArray > SuperArray;
82  SuperArray data;
83};
84
85struct CHashTableT
86{
87  int *m_slots;
88  ~CHashTableT ()
89  {
90    delete m_slots;
91  }
92};
93
94struct CYapfBaseT
95{
96  int *PfGetSettings ();
97  SmallArray m_arr;
98  CHashTableT m_closed;
99  CYapfBaseT ()
100  {
101    MallocT ();
102  }
103};
104
105struct CYapfCostRailT:CYapfBaseT
106{
107  CBlobT m_sig_look_ahead_costs;
108  CYapfCostRailT ()
109  {
110    m_sig_look_ahead_costs.Append (*Yapf ()->PfGetSettings ());
111    Yapf ()->PfGetSettings ();
112  }
113  CYapfBaseT *Yapf ();
114};
115
116void stCheckReverseTrain ()
117{
118  CYapfCostRailT pf1;
119}
120