1 // RUN: %clang_cc1 -w -fdump-record-layouts-simple %s > %t.layouts 2 // RUN: %clang_cc1 -w -DPACKED= -DALIGNED16= -fdump-record-layouts-simple -foverride-record-layout=%t.layouts %s > %t.after 3 // RUN: diff %t.layouts %t.after 4 // RUN: FileCheck %s < %t.after 5 6 // If not explicitly disabled, set PACKED to the packed attribute. 7 #ifndef PACKED 8 # define PACKED __attribute__((packed)) 9 #endif 10 11 // If not explicitly disabled, set ALIGNED16 to 16-byte alignment. 12 #ifndef ALIGNED16 13 # define ALIGNED16 __attribute__((aligned(16))) 14 #endif 15 16 // CHECK: Type: struct X0 17 struct X0 { 18 int x[6] PACKED; 19 }; 20 21 void use_X0() { struct X0 x0; x0.x[5] = sizeof(struct X0); }; 22 23 // CHECK: Type: struct X1 24 struct X1 { 25 char x[13]; 26 struct X0 y; 27 } PACKED; 28 29 void use_X1() { struct X1 x1; x1.x[5] = sizeof(struct X1); }; 30 31 // CHECK: Type: struct X2 32 struct PACKED X2 { 33 short x; 34 int y; 35 }; 36 37 void use_X2() { struct X2 x2; x2.y = sizeof(struct X2); }; 38 39 // CHECK: Type: struct X3 40 struct X3 { 41 short x PACKED; 42 int y; 43 }; 44 45 void use_X3() { struct X3 x3; x3.y = sizeof(struct X3); }; 46 47 #pragma pack(push,2) 48 // CHECK: Type: struct X4 49 struct X4 { 50 int x; 51 int y; 52 }; 53 #pragma pack(pop) 54 55 void use_X4() { struct X4 x4; x4.y = sizeof(struct X4); }; 56 57 // CHECK: Type: struct X5 58 struct PACKED X5 { double a[19]; signed char b; }; 59 60 void use_X5() { struct X5 x5; x5.b = sizeof(struct X5); }; 61 62 // CHECK: Type: struct X6 63 struct PACKED X6 { long double a; char b; }; 64 65 void use_X6() { struct X6 x6; x6.b = sizeof(struct X6); }; 66 67 // CHECK: Type: struct X7 68 struct X7 { 69 unsigned x; 70 unsigned char y; 71 } PACKED; 72 73 void use_X7() { struct X7 x7; x7.y = x7.x = sizeof(struct X7); } 74 75 // CHECK: Type: union X8 76 union X8 { 77 struct X7 x; 78 unsigned y; 79 } PACKED; 80 81 // CHECK: Type: struct X9 82 struct X9 { 83 unsigned int x[2] PACKED; 84 unsigned int y; 85 unsigned int z PACKED; 86 }; 87 88 // CHECK: Type: struct X10 89 struct X10 { 90 unsigned int x[2] PACKED; 91 unsigned int y PACKED; 92 unsigned int z PACKED; 93 }; 94 95 // CHECK: Type: struct X11 96 struct PACKED X11 { 97 unsigned int x[2]; 98 unsigned int y; 99 unsigned int z; 100 }; 101 102 // CHECK: Type: struct X12 103 struct PACKED X12 { 104 int x : 24; 105 }; 106 107 // CHECK: Type: struct X13 108 struct PACKED X13 { 109 signed x : 10; 110 signed y : 10; 111 }; 112 113 // CHECK: Type: union X14 114 union PACKED X14 { 115 unsigned long long x : 3; 116 }; 117 118 // CHECK: Type: struct X15 119 struct X15 { 120 unsigned x : 16; 121 unsigned y : 28 PACKED; 122 }; 123 124 // CHECK: Type: struct X16 125 struct ALIGNED16 X16 { 126 int a, b, c; 127 int x : 5; 128 int y : 29; 129 }; 130 131 void use_structs() { 132 union X8 x8; 133 typedef int X8array[sizeof(union X8)]; 134 x8.y = sizeof(union X8); 135 x8.x.x = x8.y; 136 137 struct X9 x9; 138 typedef int X9array[sizeof(struct X9)]; 139 x9.y = sizeof(struct X9); 140 141 struct X10 x10; 142 typedef int X10array[sizeof(struct X10)]; 143 x10.y = sizeof(struct X10); 144 145 struct X11 x11; 146 typedef int X11array[sizeof(struct X11)]; 147 x11.y = sizeof(struct X11); 148 149 struct X12 x12; 150 x12.x = sizeof(struct X12); 151 152 struct X13 x13; 153 x13.x = sizeof(struct X13); 154 155 union X14 x14; 156 x14.x = sizeof(union X14); 157 158 struct X15 x15; 159 x15.x = sizeof(struct X15); 160 161 struct X16 x16; 162 x16.x = sizeof(struct X16); 163 } 164