brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.0 KiB · 6e091fc Raw
434 lines · cpp
1// RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fdump-record-layouts \2// RUN:     -fsyntax-only -fxl-pragma-pack %s | \3// RUN:   FileCheck %s4 5// RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fdump-record-layouts \6// RUN:     -fsyntax-only -fxl-pragma-pack %s | \7// RUN:   FileCheck %s8 9namespace test1 {10// Test the class layout when having a double which is/is not the first struct11// member.12struct D {13  double d1;14  int i1;15};16 17struct DoubleFirst {18  struct D d2;19  int i2;20};21 22struct IntFirst {23  int i3;24  struct D d3;25};26 27int a = sizeof(DoubleFirst);28int b = sizeof(IntFirst);29 30// CHECK:     *** Dumping AST Record Layout31// CHECK-NEXT:         0 | struct test1::D32// CHECK-NEXT:         0 |   double d133// CHECK-NEXT:         8 |   int i134// CHECK-NEXT:           | [sizeof=16, dsize=16, align=4, preferredalign=8,35// CHECK-NEXT:           |  nvsize=16, nvalign=4, preferrednvalign=8]36 37// CHECK:     *** Dumping AST Record Layout38// CHECK-NEXT:         0 | struct test1::DoubleFirst39// CHECK-NEXT:         0 |   struct test1::D d240// CHECK-NEXT:         0 |     double d141// CHECK-NEXT:         8 |     int i142// CHECK-NEXT:        16 |   int i243// CHECK-NEXT:           | [sizeof=24, dsize=24, align=4, preferredalign=8,44// CHECK-NEXT:           |  nvsize=24, nvalign=4, preferrednvalign=8]45 46// CHECK:     *** Dumping AST Record Layout47// CHECK-NEXT:         0 | struct test1::IntFirst48// CHECK-NEXT:         0 |   int i349// CHECK-NEXT:         4 |   struct test1::D d350// CHECK-NEXT:         4 |     double d151// CHECK-NEXT:        12 |     int i152// CHECK-NEXT:           | [sizeof=20, dsize=20, align=4, preferredalign=4,53// CHECK-NEXT:           |  nvsize=20, nvalign=4, preferrednvalign=4]54} // namespace test155 56namespace test2 {57// Test the class layout when having a zero-sized bitfield followed by double.58struct Double {59  int : 0;60  double d;61};62 63int a = sizeof(Double);64 65// CHECK:     *** Dumping AST Record Layout66// CHECK-NEXT:         0 | struct test2::Double67// CHECK-NEXT:       0:- |   int68// CHECK-NEXT:         0 |   double d69// CHECK-NEXT:           | [sizeof=8, dsize=8, align=4, preferredalign=4,70// CHECK-NEXT:           |  nvsize=8, nvalign=4, preferrednvalign=4]71} // namespace test272 73namespace test3 {74// Test the class layout when having a double member in union.75union A {76  int b;77  double d;78};79 80struct UnionStruct {81  union A a;82  int i;83};84 85int a = sizeof(UnionStruct);86 87// CHECK:      *** Dumping AST Record Layout88// CHECK-NEXT:          0 | union test3::A89// CHECK-NEXT:          0 |   int b90// CHECK-NEXT:          0 |   double d91// CHECK-NEXT:            | [sizeof=8, dsize=8, align=4, preferredalign=8,92// CHECK-NEXT:            |  nvsize=8, nvalign=4, preferrednvalign=8]93 94// CHECK:      *** Dumping AST Record Layout95// CHECK-NEXT:          0 | struct test3::UnionStruct96// CHECK-NEXT:          0 |   union test3::A a97// CHECK-NEXT:          0 |     int b98// CHECK-NEXT:          0 |     double d99// CHECK-NEXT:          8 |   int i100// CHECK-NEXT:            | [sizeof=16, dsize=16, align=4, preferredalign=8,101// CHECK-NEXT:            |  nvsize=16, nvalign=4, preferrednvalign=8]102 103} // namespace test3104 105namespace test4 {106// Test the class layout when having multiple base classes.107struct A {108  int a;109};110 111struct B {112  double d;113};114 115class S : A, B {116};117 118int a = sizeof(S);119 120// CHECK:      *** Dumping AST Record Layout121// CHECK-NEXT:          0 | struct test4::A122// CHECK-NEXT:          0 |   int a123// CHECK-NEXT:            | [sizeof=4, dsize=4, align=4, preferredalign=4,124// CHECK-NEXT:            |  nvsize=4, nvalign=4, preferrednvalign=4]125 126// CHECK:      *** Dumping AST Record Layout127// CHECK-NEXT:          0 | struct test4::B128// CHECK-NEXT:          0 |   double d129// CHECK-NEXT:            | [sizeof=8, dsize=8, align=4, preferredalign=8,130// CHECK-NEXT:            |  nvsize=8, nvalign=4, preferrednvalign=8]131 132// CHECK:      *** Dumping AST Record Layout133// CHECK-NEXT:          0 | class test4::S134// CHECK-NEXT:          0 |   struct test4::A (base)135// CHECK-NEXT:          0 |     int a136// CHECK-NEXT:          4 |   struct test4::B (base)137// CHECK-NEXT:          4 |     double d138// CHECK-NEXT:            | [sizeof=12, dsize=12, align=4, preferredalign=4,139// CHECK-NEXT:            |  nvsize=12, nvalign=4, preferrednvalign=4]140} // namespace test4141 142namespace test5 {143struct Empty {144};145 146struct EmptyDer : Empty {147  double d;148};149 150struct NonEmpty {151  int i;152};153 154struct NonEmptyDer : NonEmpty {155  double d;156};157 158int a = sizeof(EmptyDer);159int b = sizeof(NonEmptyDer);160 161// CHECK:      *** Dumping AST Record Layout162// CHECK-NEXT:          0 | struct test5::Empty (empty)163// CHECK-NEXT:            | [sizeof=1, dsize=1, align=1, preferredalign=1,164// CHECK-NEXT:            |  nvsize=1, nvalign=1, preferrednvalign=1]165 166// CHECK:      *** Dumping AST Record Layout167// CHECK-NEXT:          0 | struct test5::EmptyDer168// CHECK-NEXT:          0 |   struct test5::Empty (base) (empty)169// CHECK-NEXT:          0 |   double d170// CHECK-NEXT:            | [sizeof=8, dsize=8, align=4, preferredalign=8,171// CHECK-NEXT:            |  nvsize=8, nvalign=4, preferrednvalign=8]172 173// CHECK:      *** Dumping AST Record Layout174// CHECK-NEXT:          0 | struct test5::NonEmpty175// CHECK-NEXT:          0 |   int i176// CHECK-NEXT:            | [sizeof=4, dsize=4, align=4, preferredalign=4,177// CHECK-NEXT:            |  nvsize=4, nvalign=4, preferrednvalign=4]178 179// CHECK:      *** Dumping AST Record Layout180// CHECK-NEXT:          0 | struct test5::NonEmptyDer181// CHECK-NEXT:          0 |   struct test5::NonEmpty (base)182// CHECK-NEXT:          0 |     int i183// CHECK-NEXT:          4 |   double d184// CHECK-NEXT:            | [sizeof=12, dsize=12, align=4, preferredalign=4,185// CHECK-NEXT:            |  nvsize=12, nvalign=4, preferrednvalign=4]186} // namespace test5187 188namespace test6 {189struct A {190  struct B {191    double d[3];192  } b;193};194 195int a = sizeof(A);196 197// CHECK:      *** Dumping AST Record Layout198// CHECK-NEXT:          0 | struct test6::A::B199// CHECK-NEXT:          0 |   double[3] d200// CHECK-NEXT:            | [sizeof=24, dsize=24, align=4, preferredalign=8,201// CHECK-NEXT:            |  nvsize=24, nvalign=4, preferrednvalign=8]202 203// CHECK:      *** Dumping AST Record Layout204// CHECK-NEXT:          0 | struct test6::A205// CHECK-NEXT:          0 |   struct test6::A::B b206// CHECK-NEXT:          0 |     double[3] d207// CHECK-NEXT:            | [sizeof=24, dsize=24, align=4, preferredalign=8,208// CHECK-NEXT:            |  nvsize=24, nvalign=4, preferrednvalign=8]209 210} // namespace test6211 212namespace test7 {213struct A {214  struct B {215    long double _Complex d[3];216  } b;217};218 219int a = sizeof(A);220 221// CHECK:      *** Dumping AST Record Layout222// CHECK-NEXT:          0 | struct test7::A::B223// CHECK-NEXT:          0 |   _Complex long double[3] d224// CHECK-NEXT:            | [sizeof=48, dsize=48, align=4, preferredalign=8,225// CHECK-NEXT:            |  nvsize=48, nvalign=4, preferrednvalign=8]226 227// CHECK:      *** Dumping AST Record Layout228// CHECK-NEXT:          0 | struct test7::A229// CHECK-NEXT:          0 |   struct test7::A::B b230// CHECK-NEXT:          0 |     _Complex long double[3] d231// CHECK-NEXT:            | [sizeof=48, dsize=48, align=4, preferredalign=8,232// CHECK-NEXT:            |  nvsize=48, nvalign=4, preferrednvalign=8]233 234} // namespace test7235 236namespace test8 {237struct Emp {};238 239struct Y : Emp {240  double d;241};242 243struct Z : Emp {244  Y y;245};246 247int a = sizeof(Z);248 249// CHECK:      *** Dumping AST Record Layout250// CHECK-NEXT:          0 | struct test8::Emp (empty)251// CHECK-NEXT:            | [sizeof=1, dsize=1, align=1, preferredalign=1,252// CHECK-NEXT:            |  nvsize=1, nvalign=1, preferrednvalign=1]253 254// CHECK:      *** Dumping AST Record Layout255// CHECK-NEXT:          0 | struct test8::Y256// CHECK-NEXT:          0 |   struct test8::Emp (base) (empty)257// CHECK-NEXT:          0 |   double d258// CHECK-NEXT:            | [sizeof=8, dsize=8, align=4, preferredalign=8,259// CHECK-NEXT:            |  nvsize=8, nvalign=4, preferrednvalign=8]260 261// CHECK:      *** Dumping AST Record Layout262// CHECK-NEXT:          0 | struct test8::Z263// CHECK-NEXT:          0 |   struct test8::Emp (base) (empty)264// CHECK-NEXT:          8 |   struct test8::Y y265// CHECK-NEXT:          8 |     struct test8::Emp (base) (empty)266// CHECK-NEXT:          8 |     double d267// CHECK-NEXT:            | [sizeof=16, dsize=16, align=4, preferredalign=8,268// CHECK-NEXT:            |  nvsize=16, nvalign=4, preferrednvalign=8]269 270} // namespace test8271 272namespace test9 {273// Test the class layout when having a zero-extent array in a base class, which274// renders the base class not empty.275struct A { char zea[0]; };276 277struct B : A { double d; };278 279struct C { double d; };280struct D : A, C { char x; };281 282int a = sizeof(B);283int b = sizeof(D);284 285// CHECK:               0 | struct test9::B286// CHECK-NEXT:          0 |   struct test9::A (base)287// CHECK-NEXT:          0 |     char[0] zea288// CHECK-NEXT:          0 |   double d289// CHECK-NEXT:            | [sizeof=8, dsize=8, align=4, preferredalign=4,290// CHECK-NEXT:            |  nvsize=8, nvalign=4, preferrednvalign=4]291 292// CHECK:               0 | struct test9::D293// CHECK-NEXT:          0 |   struct test9::A (base)294// CHECK-NEXT:          0 |     char[0] zea295// CHECK-NEXT:          0 |   struct test9::C (base)296// CHECK-NEXT:          0 |     double d297// CHECK-NEXT:          8 |   char x298// CHECK-NEXT:            | [sizeof=12, dsize=9, align=4, preferredalign=4,299// CHECK-NEXT:            |  nvsize=9, nvalign=4, preferrednvalign=4]300 301} // namespace test9302 303namespace test10 {304struct A { double x; };305struct B : A {};306 307int a = sizeof(B);308 309// CHECK:               0 | struct test10::B310// CHECK-NEXT:          0 |   struct test10::A (base)311// CHECK-NEXT:          0 |     double x312// CHECK-NEXT:            | [sizeof=8, dsize=8, align=4, preferredalign=8,313// CHECK-NEXT:            |  nvsize=8, nvalign=4, preferrednvalign=8]314 315} // namespace test10316 317namespace test11 {318// Test how #pragma pack and align attribute interacts with AIX `power`319// alignment rules.320struct A {321  char a;322  double __attribute__((aligned(16))) d;323  int i;324};325 326struct B {327  double __attribute__((aligned(4))) d1;328  char a;329  double d2;330};331 332#pragma pack(2)333struct C {334  int i;335  short j;336  double k;337};338#pragma pack(pop)339 340#pragma pack(2)341struct D {342  double d;343  short j;344  int i;345};346#pragma pack(pop)347 348#pragma pack(8)349struct E {350  double __attribute__((aligned(4))) d;351  short s;352};353#pragma pack(pop)354 355#pragma pack(4)356struct F : public D {357  double d;358};359#pragma pack(pop)360 361#pragma pack(2)362struct G : public E {363  int i;364};365#pragma pack(pop)366 367int a = sizeof(A);368int b = sizeof(B);369int c = sizeof(C);370int d = sizeof(D);371int e = sizeof(E);372int f = sizeof(F);373int g = sizeof(G);374 375// CHECK:      *** Dumping AST Record Layout376// CHECK-NEXT:          0 | struct test11::A377// CHECK-NEXT:          0 |   char a378// CHECK-NEXT:         16 |   double d379// CHECK-NEXT:         24 |   int i380// CHECK-NEXT:            | [sizeof=32, dsize=32, align=16, preferredalign=16,381// CHECK-NEXT:            |  nvsize=32, nvalign=16, preferrednvalign=16]382 383// CHECK:      *** Dumping AST Record Layout384// CHECK-NEXT:          0 | struct test11::B385// CHECK-NEXT:          0 |   double d1386// CHECK-NEXT:          8 |   char a387// CHECK-NEXT:         12 |   double d2388// CHECK-NEXT:            | [sizeof=24, dsize=24, align=4, preferredalign=8,389// CHECK-NEXT:            |  nvsize=24, nvalign=4, preferrednvalign=8]390 391// CHECK:      *** Dumping AST Record Layout392// CHECK-NEXT:          0 | struct test11::C393// CHECK-NEXT:          0 |   int i394// CHECK-NEXT:          4 |   short j395// CHECK-NEXT:          6 |   double k396// CHECK-NEXT:            | [sizeof=14, dsize=14, align=2, preferredalign=2,397// CHECK-NEXT:            |  nvsize=14, nvalign=2, preferrednvalign=2]398 399// CHECK:      *** Dumping AST Record Layout400// CHECK-NEXT:          0 | struct test11::D401// CHECK-NEXT:          0 |   double d402// CHECK-NEXT:          8 |   short j403// CHECK-NEXT:         10 |   int i404// CHECK-NEXT:            | [sizeof=14, dsize=14, align=2, preferredalign=2,405// CHECK-NEXT:            |  nvsize=14, nvalign=2, preferrednvalign=2]406 407// CHECK:      *** Dumping AST Record Layout408// CHECK-NEXT:          0 | struct test11::E409// CHECK-NEXT:          0 |   double d410// CHECK-NEXT:          8 |   short s411// CHECK-NEXT:            | [sizeof=16, dsize=16, align=4, preferredalign=8,412// CHECK-NEXT:            |  nvsize=16, nvalign=4, preferrednvalign=8]413 414// CHECK:      *** Dumping AST Record Layout415// CHECK-NEXT:          0 | struct test11::F416// CHECK-NEXT:          0 |   struct test11::D (base)417// CHECK-NEXT:          0 |     double d418// CHECK-NEXT:          8 |     short j419// CHECK-NEXT:         10 |     int i420// CHECK-NEXT:         16 |   double d421// CHECK-NEXT:            | [sizeof=24, dsize=24, align=4, preferredalign=4,422// CHECK-NEXT:            |  nvsize=24, nvalign=4, preferrednvalign=4]423 424// CHECK:      *** Dumping AST Record Layout425// CHECK-NEXT:          0 | struct test11::G426// CHECK-NEXT:          0 |   struct test11::E (base)427// CHECK-NEXT:          0 |     double d428// CHECK-NEXT:          8 |     short s429// CHECK-NEXT:         16 |   int i430// CHECK-NEXT:            | [sizeof=20, dsize=20, align=2, preferredalign=2,431// CHECK-NEXT:            |  nvsize=20, nvalign=2, preferrednvalign=2]432 433} // namespace test11434