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