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