// { dg-do assemble }
|
// { dg-do assemble }
|
|
|
// Copyright (C) 2001 Free Software Foundation, Inc.
|
// Copyright (C) 2001 Free Software Foundation, Inc.
|
// Contributed by Nathan Sidwell 12 Apr 2001
|
// Contributed by Nathan Sidwell 12 Apr 2001
|
|
|
// Check we deal with trailing empty base classes properly
|
// Check we deal with trailing empty base classes properly
|
|
|
struct A {};
|
struct A {};
|
struct B1 : A {};
|
struct B1 : A {};
|
struct B2 : A {};
|
struct B2 : A {};
|
struct B3 : A {};
|
struct B3 : A {};
|
struct B4 : A {};
|
struct B4 : A {};
|
struct B5 : A {};
|
struct B5 : A {};
|
struct B6 : A {};
|
struct B6 : A {};
|
struct B7 : A {};
|
struct B7 : A {};
|
struct B8 : A {};
|
struct B8 : A {};
|
|
|
struct C1 : B1
|
struct C1 : B1
|
{
|
{
|
virtual void Foo () {}
|
virtual void Foo () {}
|
};
|
};
|
struct C2 : B1, B2
|
struct C2 : B1, B2
|
{
|
{
|
virtual void Foo () {}
|
virtual void Foo () {}
|
};
|
};
|
struct C3 : B1, B2, B3
|
struct C3 : B1, B2, B3
|
{
|
{
|
virtual void Foo () {}
|
virtual void Foo () {}
|
};
|
};
|
struct C4 : B1, B2, B3, B4
|
struct C4 : B1, B2, B3, B4
|
{
|
{
|
virtual void Foo () {}
|
virtual void Foo () {}
|
};
|
};
|
struct C5 : B1, B2, B3, B4, B5
|
struct C5 : B1, B2, B3, B4, B5
|
{
|
{
|
virtual void Foo () {}
|
virtual void Foo () {}
|
};
|
};
|
struct C6 : B1, B2, B3, B4, B5, B6
|
struct C6 : B1, B2, B3, B4, B5, B6
|
{
|
{
|
virtual void Foo () {}
|
virtual void Foo () {}
|
};
|
};
|
struct C7 : B1, B2, B3, B4, B5, B6, B7
|
struct C7 : B1, B2, B3, B4, B5, B6, B7
|
{
|
{
|
virtual void Foo () {}
|
virtual void Foo () {}
|
};
|
};
|
struct C8 : B1, B2, B3, B4, B5, B6, B7, B8
|
struct C8 : B1, B2, B3, B4, B5, B6, B7, B8
|
{
|
{
|
virtual void Foo () {}
|
virtual void Foo () {}
|
};
|
};
|
|
|
struct D1 : virtual C1 {};
|
struct D1 : virtual C1 {};
|
struct D2 : virtual C2 {};
|
struct D2 : virtual C2 {};
|
struct D3 : virtual C3 {};
|
struct D3 : virtual C3 {};
|
struct D4 : virtual C4 {};
|
struct D4 : virtual C4 {};
|
struct D5 : virtual C5 {};
|
struct D5 : virtual C5 {};
|
struct D6 : virtual C6 {};
|
struct D6 : virtual C6 {};
|
struct D7 : virtual C7 {};
|
struct D7 : virtual C7 {};
|
struct D8 : virtual C8 {};
|
struct D8 : virtual C8 {};
|
|
|
unsigned const nearly_empty_size = sizeof (D1);
|
unsigned const nearly_empty_size = sizeof (D1);
|
|
|
template int Check (Dn const &ref)
|
template int Check (Dn const &ref)
|
{
|
{
|
if ((sizeof (Cn) <= nearly_empty_size)
|
if ((sizeof (Cn) <= nearly_empty_size)
|
!= (static_cast (&ref)
|
!= (static_cast (&ref)
|
== static_cast (&ref)))
|
== static_cast (&ref)))
|
return 1;
|
return 1;
|
return 0;
|
return 0;
|
}
|
}
|
|
|
template int Check ()
|
template int Check ()
|
{
|
{
|
Cn c[2];
|
Cn c[2];
|
|
|
if (static_cast (static_cast (&c[1]))
|
if (static_cast (static_cast (&c[1]))
|
== static_cast (static_cast (&c[0])))
|
== static_cast (static_cast (&c[0])))
|
return 1;
|
return 1;
|
return 0;
|
return 0;
|
}
|
}
|
|
|
|
|
int main ()
|
int main ()
|
{
|
{
|
#if defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100
|
#if defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100
|
if (Check ())
|
if (Check ())
|
return 1;
|
return 1;
|
if (Check ())
|
if (Check ())
|
return 2;
|
return 2;
|
if (Check ())
|
if (Check ())
|
return 3;
|
return 3;
|
if (Check ())
|
if (Check ())
|
return 4;
|
return 4;
|
if (Check ())
|
if (Check ())
|
return 5;
|
return 5;
|
if (Check ())
|
if (Check ())
|
return 6;
|
return 6;
|
if (Check ())
|
if (Check ())
|
return 7;
|
return 7;
|
if (Check ())
|
if (Check ())
|
return 8;
|
return 8;
|
|
|
if (Check (D1 ()))
|
if (Check (D1 ()))
|
return 11;
|
return 11;
|
if (Check (D2 ()))
|
if (Check (D2 ()))
|
return 12;
|
return 12;
|
if (Check (D3 ()))
|
if (Check (D3 ()))
|
return 13;
|
return 13;
|
if (Check (D4 ()))
|
if (Check (D4 ()))
|
return 14;
|
return 14;
|
if (Check (D5 ()))
|
if (Check (D5 ()))
|
return 15;
|
return 15;
|
if (Check (D6 ()))
|
if (Check (D6 ()))
|
return 16;
|
return 16;
|
if (Check (D7 ()))
|
if (Check (D7 ()))
|
return 17;
|
return 17;
|
if (Check (D8 ()))
|
if (Check (D8 ()))
|
return 18;
|
return 18;
|
|
|
if (sizeof (C2) == nearly_empty_size)
|
if (sizeof (C2) == nearly_empty_size)
|
return 22;
|
return 22;
|
if (sizeof (C3) == nearly_empty_size)
|
if (sizeof (C3) == nearly_empty_size)
|
return 23;
|
return 23;
|
if (sizeof (C4) == nearly_empty_size)
|
if (sizeof (C4) == nearly_empty_size)
|
return 24;
|
return 24;
|
if (sizeof (C5) == nearly_empty_size)
|
if (sizeof (C5) == nearly_empty_size)
|
return 25;
|
return 25;
|
if (sizeof (C6) == nearly_empty_size)
|
if (sizeof (C6) == nearly_empty_size)
|
return 26;
|
return 26;
|
if (sizeof (C7) == nearly_empty_size)
|
if (sizeof (C7) == nearly_empty_size)
|
return 27;
|
return 27;
|
if (sizeof (C8) == nearly_empty_size)
|
if (sizeof (C8) == nearly_empty_size)
|
return 28;
|
return 28;
|
#endif
|
#endif
|
return 0;
|
return 0;
|
|
|
}
|
}
|
|
|