// RUN: %clang_cc1 -w -fdump-record-layouts %s > %t.layouts // RUN: %clang_cc1 -w -fdump-record-layouts-simple %s > %t.before // RUN: %clang_cc1 -w -DPACKED= -DALIGNED16= -fdump-record-layouts-simple -foverride-record-layout=%t.layouts %s > %t.after // RUN: diff %t.before %t.after // RUN: FileCheck %s < %t.after // If not explicitly disabled, set PACKED to the packed attribute. #ifndef PACKED # define PACKED __attribute__((packed)) #endif // If not explicitly disabled, set ALIGNED16 to 16-byte alignment. #ifndef ALIGNED16 # define ALIGNED16 __attribute__((aligned(16))) #endif // CHECK: Type: struct X0 struct X0 { int x[6] PACKED; }; void use_X0() { struct X0 x0; x0.x[5] = sizeof(struct X0); }; // CHECK: Type: struct X1 struct X1 { char x[13]; struct X0 y; } PACKED; void use_X1() { struct X1 x1; x1.x[5] = sizeof(struct X1); }; // CHECK: Type: struct X2 struct PACKED X2 { short x; int y; }; void use_X2() { struct X2 x2; x2.y = sizeof(struct X2); }; // CHECK: Type: struct X3 struct X3 { short x PACKED; int y; }; void use_X3() { struct X3 x3; x3.y = sizeof(struct X3); }; #pragma pack(push,2) // CHECK: Type: struct X4 struct X4 { int x; int y; }; #pragma pack(pop) void use_X4() { struct X4 x4; x4.y = sizeof(struct X4); }; // CHECK: Type: struct X5 struct PACKED X5 { double a[19]; signed char b; }; void use_X5() { struct X5 x5; x5.b = sizeof(struct X5); }; // CHECK: Type: struct X6 struct PACKED X6 { long double a; char b; }; void use_X6() { struct X6 x6; x6.b = sizeof(struct X6); }; // CHECK: Type: struct X7 struct X7 { unsigned x; unsigned char y; } PACKED; void use_X7() { struct X7 x7; x7.y = x7.x = sizeof(struct X7); } // CHECK: Type: union X8 union X8 { struct X7 x; unsigned y; } PACKED; // CHECK: Type: struct X9 struct X9 { unsigned int x[2] PACKED; unsigned int y; unsigned int z PACKED; }; // CHECK: Type: struct X10 struct X10 { unsigned int x[2] PACKED; unsigned int y PACKED; unsigned int z PACKED; }; // CHECK: Type: struct X11 struct PACKED X11 { unsigned int x[2]; unsigned int y; unsigned int z; }; // CHECK: Type: struct X12 struct PACKED X12 { int x : 24; }; // CHECK: Type: struct X13 struct PACKED X13 { signed x : 10; signed y : 10; }; // CHECK: Type: union X14 union PACKED X14 { unsigned long long x : 3; }; // CHECK: Type: struct X15 struct X15 { unsigned x : 16; unsigned y : 28 PACKED; }; // CHECK: Type: struct X16 struct ALIGNED16 X16 { int a, b, c; int x : 5; int y : 29; }; void use_structs() { union X8 x8; typedef int X8array[sizeof(union X8)]; x8.y = sizeof(union X8); x8.x.x = x8.y; struct X9 x9; typedef int X9array[sizeof(struct X9)]; x9.y = sizeof(struct X9); struct X10 x10; typedef int X10array[sizeof(struct X10)]; x10.y = sizeof(struct X10); struct X11 x11; typedef int X11array[sizeof(struct X11)]; x11.y = sizeof(struct X11); struct X12 x12; x12.x = sizeof(struct X12); struct X13 x13; x13.x = sizeof(struct X13); union X14 x14; x14.x = sizeof(union X14); struct X15 x15; x15.x = sizeof(struct X15); struct X16 x16; x16.x = sizeof(struct X16); }