1c250192494e0fa63be50269d2c1eb7786f8ab7a0Argyrios Kyrtzidis// RUN: %clang_cc1 -w -fdump-record-layouts %s > %t.layouts 2c250192494e0fa63be50269d2c1eb7786f8ab7a0Argyrios Kyrtzidis// RUN: %clang_cc1 -w -fdump-record-layouts-simple %s > %t.before 3c250192494e0fa63be50269d2c1eb7786f8ab7a0Argyrios Kyrtzidis// RUN: %clang_cc1 -w -DPACKED= -DALIGNED16= -fdump-record-layouts-simple -foverride-record-layout=%t.layouts %s > %t.after 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 220dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlovvoid use_X0() { struct X0 x0; x0.x[5] = sizeof(struct X0); }; 230dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlov 24453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X1 25453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct X1 { 26453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor char x[13]; 27453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X0 y; 28453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor} PACKED; 29453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 300dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlovvoid use_X1() { struct X1 x1; x1.x[5] = sizeof(struct X1); }; 310dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlov 32453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X2 33453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct PACKED X2 { 34453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor short x; 35453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int y; 36453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 37453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 380dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlovvoid use_X2() { struct X2 x2; x2.y = sizeof(struct X2); }; 390dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlov 40453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X3 41453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct X3 { 42453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor short x PACKED; 43453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int y; 44453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 45453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 460dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlovvoid use_X3() { struct X3 x3; x3.y = sizeof(struct X3); }; 470dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlov 48453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor#pragma pack(push,2) 49453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X4 50453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct X4 { 51453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int x; 52453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int y; 53453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 54453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor#pragma pack(pop) 55453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 560dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlovvoid use_X4() { struct X4 x4; x4.y = sizeof(struct X4); }; 570dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlov 58453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X5 59453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct PACKED X5 { double a[19]; signed char b; }; 60453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 610dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlovvoid use_X5() { struct X5 x5; x5.b = sizeof(struct X5); }; 620dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlov 63453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X6 64453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct PACKED X6 { long double a; char b; }; 65453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 660dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlovvoid use_X6() { struct X6 x6; x6.b = sizeof(struct X6); }; 670dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlov 68453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X7 69a2a50282c34b6e1f95c5a14c5e2b8927c34427deDouglas Gregorstruct X7 { 70453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned x; 71453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned char y; 72453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor} PACKED; 73453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 740dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlovvoid use_X7() { struct X7 x7; x7.y = x7.x = sizeof(struct X7); } 750dcea35c21b001c9c2c9b4d4a8cfd4c82dc5f00cSerge Pavlov 76453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: union X8 77453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorunion X8 { 78453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X7 x; 79453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned y; 80453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor} PACKED; 81453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 82453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X9 83453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct X9 { 84453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int x[2] PACKED; 85453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int y; 86453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int z PACKED; 87453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 88453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 89453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X10 90453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct X10 { 91453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int x[2] PACKED; 92453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int y PACKED; 93453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int z PACKED; 94453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 95453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 96453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X11 97453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct PACKED X11 { 98453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int x[2]; 99453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int y; 100453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned int z; 101453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 102453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 103453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X12 104453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct PACKED X12 { 105453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int x : 24; 106453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 107453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 108453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X13 109453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct PACKED X13 { 110453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor signed x : 10; 111453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor signed y : 10; 112453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 113453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 114453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: union X14 115453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorunion PACKED X14 { 116453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned long long x : 3; 117453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 118453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 119453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X15 120453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct X15 { 121453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned x : 16; 122453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor unsigned y : 28 PACKED; 123453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 124453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 125453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor// CHECK: Type: struct X16 126453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorstruct ALIGNED16 X16 { 127453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int a, b, c; 128453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int x : 5; 129453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor int y : 29; 130453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor}; 131453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 132453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregorvoid use_structs() { 133453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor union X8 x8; 134a2a50282c34b6e1f95c5a14c5e2b8927c34427deDouglas Gregor typedef int X8array[sizeof(union X8)]; 135453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x8.y = sizeof(union X8); 136a2a50282c34b6e1f95c5a14c5e2b8927c34427deDouglas Gregor x8.x.x = x8.y; 137453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 138453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X9 x9; 139a2a50282c34b6e1f95c5a14c5e2b8927c34427deDouglas Gregor typedef int X9array[sizeof(struct X9)]; 140453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x9.y = sizeof(struct X9); 141453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 142453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X10 x10; 143a2a50282c34b6e1f95c5a14c5e2b8927c34427deDouglas Gregor typedef int X10array[sizeof(struct X10)]; 144453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x10.y = sizeof(struct X10); 145453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 146453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X11 x11; 147a2a50282c34b6e1f95c5a14c5e2b8927c34427deDouglas Gregor typedef int X11array[sizeof(struct X11)]; 148453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x11.y = sizeof(struct X11); 149453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 150453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X12 x12; 151453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x12.x = sizeof(struct X12); 152453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 153453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X13 x13; 154453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x13.x = sizeof(struct X13); 155453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 156453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor union X14 x14; 157453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x14.x = sizeof(union X14); 158453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 159453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X15 x15; 160453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x15.x = sizeof(struct X15); 161453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor 162453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor struct X16 x16; 163453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor x16.x = sizeof(struct X16); 164453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor} 165