| // RUN: %clang_cc1 -w -fdump-record-layouts-simple %s > %t.layouts | |
| // RUN: %clang_cc1 -w -DPACKED= -DALIGNED16= -fdump-record-layouts-simple -foverride-record-layout=%t.layouts %s > %t.after | |
| // RUN: diff %t.layouts %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(void) { 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(void) { struct X1 x1; x1.x[5] = sizeof(struct X1); }; | |
| // CHECK: Type: struct X2 | |
| struct PACKED X2 { | |
| short x; | |
| int y; | |
| }; | |
| void use_X2(void) { struct X2 x2; x2.y = sizeof(struct X2); }; | |
| // CHECK: Type: struct X3 | |
| struct X3 { | |
| short x PACKED; | |
| int y; | |
| }; | |
| void use_X3(void) { 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(void) { struct X4 x4; x4.y = sizeof(struct X4); }; | |
| // CHECK: Type: struct X5 | |
| struct PACKED X5 { double a[19]; signed char b; }; | |
| void use_X5(void) { struct X5 x5; x5.b = sizeof(struct X5); }; | |
| // CHECK: Type: struct X6 | |
| struct PACKED X6 { long double a; char b; }; | |
| void use_X6(void) { struct X6 x6; x6.b = sizeof(struct X6); }; | |
| // CHECK: Type: struct X7 | |
| struct X7 { | |
| unsigned x; | |
| unsigned char y; | |
| } PACKED; | |
| void use_X7(void) { 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(void) { | |
| 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); | |
| } |