1// { dg-do run  }
2// { dg-options "-fno-strict-aliasing" }
3// Test various aspects of vtable layout.
4// Origin: Mark Mitchell <mark@codesourcery.com>
5
6#if defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100
7
8struct S0
9{
10  virtual void h ()
11  {
12  }
13
14  int k;
15};
16
17
18struct S1
19{
20  virtual void f ()
21  {
22  }
23
24  int i;
25};
26
27struct S2 : virtual public S0
28{
29  virtual void g ()
30  {
31  }
32
33  int j;
34};
35
36struct S3
37{
38  virtual void k ()
39  {
40  }
41
42  int l;
43};
44
45struct S4 : public virtual S1, public S2, public S3
46{
47};
48
49inline void* vtable (void *object)
50{
51  // The vptr is always the first part of the object.
52  return * (void **) object;
53}
54
55int main ()
56{
57  // The vtable layout order for S4 should consist of S4's primary
58  // vtable (shared with S2), followed by the vtable for S3 (because
59  // it is a non-virtual base).  Then, these should be followed by the
60  // the vtables for S1 and S0, which are virtual.
61  S4 s4;
62  S0 *s0 = &s4;
63  S1 *s1 = &s4;
64  S2 *s2 = &s4;
65  S3 *s3 = &s4;
66
67  if (vtable (&s4) != vtable (s2))
68    return 1;
69  if (vtable (s2) >= vtable (s3))
70    return 2;
71  if (vtable (s3) >= vtable (s1))
72    return 3;
73  if (vtable (s1) >= vtable (s0))
74    return 4;
75}
76
77#else /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */
78
79int main ()
80{
81}
82
83#endif /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */
84