| // 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); |
| } |