113663926db6e62c0ed5203d8ec4e543b2c190f0fChandler Carruth// RUN: %clang_cc1 -w -fdump-record-layouts %s 2> %t.layouts 213663926db6e62c0ed5203d8ec4e543b2c190f0fChandler Carruth// RUN: %clang_cc1 -w -fdump-record-layouts-simple %s > %t.before 2>&1 313663926db6e62c0ed5203d8ec4e543b2c190f0fChandler Carruth// RUN: %clang_cc1 -w -DPACKED= -DALIGNED16= -fdump-record-layouts-simple -foverride-record-layout=%t.layouts %s > %t.after 2>&1 4453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// RUN: diff %t.before %t.after 5453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// RUN: FileCheck %s < %t.after 6453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 7453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// If not explicitly disabled, set PACKED to the packed attribute. 8453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor#ifndef PACKED 9453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor# define PACKED __attribute__((packed)) 10453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor#endif 11453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 12453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// If not explicitly disabled, set ALIGNED16 to 16-byte alignment. 13453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor#ifndef ALIGNED16 14453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor# define ALIGNED16 __attribute__((aligned(16))) 15453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor#endif 16453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 17453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X0 18453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct X0 { 19453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int x[6] PACKED; 20453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 21453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 22453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X1 23453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct X1 { 24453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor char x[13]; 25453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X0 y; 26453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor} PACKED; 27453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 28453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X2 29453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct PACKED X2 { 30453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor short x; 31453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int y; 32453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 33453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 34453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X3 35453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct X3 { 36453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor short x PACKED; 37453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int y; 38453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 39453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 40453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor#pragma pack(push,2) 41453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X4 42453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct X4 { 43453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int x; 44453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int y; 45453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 46453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor#pragma pack(pop) 47453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 48453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X5 49453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct PACKED X5 { double a[19]; signed char b; }; 50453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 51453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X6 52453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct PACKED X6 { long double a; char b; }; 53453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 54453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X7 55a2a50282c34b6e1f95c5a14c5e2b8927c34427deDouglas Gregorstruct X7 { 56453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned x; 57453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned char y; 58453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor} PACKED; 59453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 60453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: union X8 61453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorunion X8 { 62453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X7 x; 63453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned y; 64453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor} PACKED; 65453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 66453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X9 67453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct X9 { 68453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int x[2] PACKED; 69453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int y; 70453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int z PACKED; 71453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 72453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 73453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X10 74453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct X10 { 75453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int x[2] PACKED; 76453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int y PACKED; 77453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int z PACKED; 78453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 79453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 80453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X11 81453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct PACKED X11 { 82453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int x[2]; 83453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int y; 84453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int z; 85453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 86453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 87453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X12 88453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct PACKED X12 { 89453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int x : 24; 90453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 91453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 92453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X13 93453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct PACKED X13 { 94453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor signed x : 10; 95453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor signed y : 10; 96453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 97453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 98453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: union X14 99453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorunion PACKED X14 { 100453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned long long x : 3; 101453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 102453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 103453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X15 104453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct X15 { 105453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned x : 16; 106453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned y : 28 PACKED; 107453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 108453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 109453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X16 110453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct ALIGNED16 X16 { 111453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int a, b, c; 112453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int x : 5; 113453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int y : 29; 114453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 115453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 116453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorvoid use_structs() { 117453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X0 x0; 118453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x0.x[5] = sizeof(struct X0); 119453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 120453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X1 x1; 121453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x1.x[5] = sizeof(struct X1); 122453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 123453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X2 x2; 124453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x2.y = sizeof(struct X2); 125453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 126453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X3 x3; 127453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x3.y = sizeof(struct X3); 128453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 129453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X4 x4; 130453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x4.y = sizeof(struct X4); 131453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 132453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X5 x5; 133453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x5.b = sizeof(struct X5); 134453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 135453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X6 x6; 136453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x6.b = sizeof(struct X6); 137453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 138453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X7 x7; 139b9cd498fd40fef5e2eed987ae2c31d0bfdf35f8dDouglas Gregor typedef int X7array[sizeof(struct X7)]; 140453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x7.x = sizeof(struct X7); 141a2a50282c34b6e1f95c5a14c5e2b8927c34427deDouglas Gregor x7.y = x7.x; 142453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 143453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor union X8 x8; 144a2a50282c34b6e1f95c5a14c5e2b8927c34427deDouglas Gregor typedef int X8array[sizeof(union X8)]; 145453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x8.y = sizeof(union X8); 146a2a50282c34b6e1f95c5a14c5e2b8927c34427deDouglas Gregor x8.x.x = x8.y; 147453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 148453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X9 x9; 149a2a50282c34b6e1f95c5a14c5e2b8927c34427deDouglas Gregor typedef int X9array[sizeof(struct X9)]; 150453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x9.y = sizeof(struct X9); 151453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 152453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X10 x10; 153a2a50282c34b6e1f95c5a14c5e2b8927c34427deDouglas Gregor typedef int X10array[sizeof(struct X10)]; 154453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x10.y = sizeof(struct X10); 155453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 156453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X11 x11; 157a2a50282c34b6e1f95c5a14c5e2b8927c34427deDouglas Gregor typedef int X11array[sizeof(struct X11)]; 158453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x11.y = sizeof(struct X11); 159453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 160453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X12 x12; 161453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x12.x = sizeof(struct X12); 162453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 163453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X13 x13; 164453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x13.x = sizeof(struct X13); 165453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 166453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor union X14 x14; 167453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x14.x = sizeof(union X14); 168453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 169453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X15 x15; 170453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x15.x = sizeof(struct X15); 171453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 172453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X16 x16; 173453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x16.x = sizeof(struct X16); 174453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor} 175