forked from OSchip/llvm-project
105 lines
1.5 KiB
C++
105 lines
1.5 KiB
C++
// 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);
|
|
|
|
}
|