// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -fsyntax-only -verify #define SA(n, p) int a##n[(p) ? 1 : -1] struct A { int a; char b; }; SA(0, sizeof(A) == 8); struct B : A { char c; }; SA(1, sizeof(B) == 12); struct C { // Make fields private so C won't be a POD type. private: int a; char b; }; SA(2, sizeof(C) == 8); struct D : C { char c; }; SA(3, sizeof(D) == 8); struct __attribute__((packed)) E { char b; int a; }; SA(4, sizeof(E) == 5); struct __attribute__((packed)) F : E { char d; }; SA(5, sizeof(F) == 6); struct G { G(); }; struct H : G { }; SA(6, sizeof(H) == 1); struct I { char b; int a; } __attribute__((packed)); SA(6_1, sizeof(I) == 5); // PR5580 namespace PR5580 { class A { bool iv0 : 1; }; SA(7, sizeof(A) == 1); class B : A { bool iv0 : 1; }; SA(8, sizeof(B) == 2); struct C { bool iv0 : 1; }; SA(9, sizeof(C) == 1); struct D : C { bool iv0 : 1; }; SA(10, sizeof(D) == 2); } namespace Test1 { // Test that we don't assert on this hierarchy. struct A { }; struct B : A { virtual void b(); }; class C : virtual A { int c; }; struct D : virtual B { }; struct E : C, virtual D { }; class F : virtual E { }; struct G : virtual E, F { }; SA(0, sizeof(G) == 24); } namespace Test2 { // Test that this somewhat complex class structure is laid out correctly. struct A { }; struct B : A { virtual void b(); }; struct C : virtual B { }; struct D : virtual A { }; struct E : virtual B, D { }; struct F : E, virtual C { }; struct G : virtual F, A { }; struct H { G g; }; SA(0, sizeof(H) == 24); }