// { dg-do run  }
// { dg-options "-w" }
// Origin: Mark Mitchell <mark@codesourcery.com>
#if defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100
struct S0
{
};
struct S1 : public S0
{
};
struct S2 : public S1
{
  char c;
};
// In S3, the S1 instance is allocated first at offset zero.  The S2
// instance has to be allocated at a subsequent offset; it's first
// part is also an S1.
struct S3 : public S1, public S2
{
};
struct S4 
{
  int i;
};
// In S4, in contrast to S3, S2 is allocated first, and S1 can be
// allocated on top of S4.
struct S5 : public S2, public S1, public S4
{
};
// The T classes are by-hand layouts that should be equivalent to the
// S classes.
struct T3
{
  S1 s1;
  S2 s2;
};
struct T5
{
  S2 s2;
  S4 s4;
};
int main ()
{
  if (sizeof (S3) != sizeof (T3))
    return 1;
  else if (sizeof (S5) != sizeof (T5))
    return 2;
}
#else /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */
int main () 
{
}
#endif /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */