1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts %s 2>/dev/null \
2 // RUN:            | FileCheck %s
3 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts %s 2>/dev/null \
4 // RUN:            | FileCheck %s
5 
6 typedef struct A {
7 	char x;
8 	int a : 22;
9 	int : 0;
10 	int c : 10;
11 	char b : 3;
12 	char d: 4;
13 	short y;
14 } A;
15 
16 // CHECK:*** Dumping AST Record Layout
17 // CHECK-NEXT:      0 | struct A
18 // CHECK-NEXT:      0 |   char x
19 // CHECK-NEXT: 4:0-21 |   int a
20 // CHECK-NEXT:    8:- |   int
21 // CHECK-NEXT:  8:0-9 |   int c
22 // CHECK-NEXT: 12:0-2 |   char b
23 // CHECK-NEXT: 12:3-6 |   char d
24 // CHECK-NEXT:     14 |   short y
25 // CHECK-NEXT:        | [sizeof=16, align=4]
26 
27 typedef struct B {
28 	char x;
29 	int : 0;
30 	short a : 4;
31 	char y;
32 } B;
33 
34 // CHECK:*** Dumping AST Record Layout
35 // CHECK-NEXT:      0 | struct B
36 // CHECK-NEXT:      0 |   char x
37 // CHECK-NEXT:    1:- |   int
38 // CHECK-NEXT:  2:0-3 |   short a
39 // CHECK-NEXT:      4 |   char y
40 // CHECK-NEXT:        | [sizeof=6, align=2]
41 
42 typedef struct C {
43 	char x;
44 	short a : 4;
45 	int : 0;
46 	char y;
47 } C;
48 
49 // CHECK:*** Dumping AST Record Layout
50 // CHECK-NEXT:      0 | struct C
51 // CHECK-NEXT:      0 |   char x
52 // CHECK-NEXT:  2:0-3 |   short a
53 // CHECK-NEXT:    4:- |   int
54 // CHECK-NEXT:      4 |   char y
55 // CHECK-NEXT:        | [sizeof=8, align=4]
56 
57 typedef struct D {
58 	char x;
59 	short : 0;
60 	int : 0;
61 	char y;
62 } D;
63 
64 // CHECK:*** Dumping AST Record Layout
65 // CHECK-NEXT:      0 | struct D
66 // CHECK-NEXT:      0 |   char x
67 // CHECK-NEXT:    1:- |   short
68 // CHECK-NEXT:    1:- |   int
69 // CHECK-NEXT:      1 |   char y
70 // CHECK-NEXT:        | [sizeof=2, align=1]
71 
72 typedef union E {
73 	char x;
74 	long long a : 3;
75 	int b : 3;
76 	long long : 0;
77 	short y;
78 } E;
79 
80 
81 // CHECK:*** Dumping AST Record Layout
82 // CHECK-NEXT:      0 | union E
83 // CHECK-NEXT:      0 |   char x
84 // CHECK-NEXT:  0:0-2 |   long long a
85 // CHECK-NEXT:  0:0-2 |   int b
86 // CHECK-NEXT:    0:- |   long long
87 // CHECK-NEXT:      0 |   short
88 // CHECK-NEXT:        | [sizeof=8, align=2]
89 
90 typedef struct F {
91 	char x;
92 	char a : 3;
93 	char b : 3;
94 	char c : 3;
95 	short d : 6;
96 	short e : 6;
97 	short f : 6;
98 	short g : 11;
99 	short h : 11;
100 	short i : 11;
101 	short y;
102 } F;
103 
104 // CHECK:*** Dumping AST Record Layout
105 // CHECK-NEXT:      0 | struct F
106 // CHECK-NEXT:      0 |   char x
107 // CHECK-NEXT:  1:0-2 |   char a
108 // CHECK-NEXT:  1:3-5 |   char b
109 // CHECK-NEXT:  2:0-2 |   char c
110 // CHECK-NEXT:  4:0-5 |   short d
111 // CHECK-NEXT: 4:6-11 |   short e
112 // CHECK-NEXT:  6:0-5 |   short f
113 // CHECK-NEXT: 8:0-10 |   short g
114 // CHECK-NEXT:10:0-10 |   short h
115 // CHECK-NEXT:12:0-10 |   short i
116 // CHECK-NEXT:     14 |   short y
117 // CHECK-NEXT:        | [sizeof=16, align=2]
118 
119 typedef union G {
120 	char x;
121 	int a : 3;
122 	int : 0;
123 	long long : 0;
124 	short y;
125 } G;
126 
127 // CHECK:*** Dumping AST Record Layout
128 // CHECK-NEXT:      0 | union G
129 // CHECK-NEXT:      0 |   char x
130 // CHECK-NEXT:  0:0-2 |   int a
131 // CHECK-NEXT:    0:- |   int
132 // CHECK-NEXT:    0:- |   long long
133 // CHECK-NEXT:      0 |   short y
134 // CHECK-NEXT:        | [sizeof=4, align=2]
135 
136 typedef struct H {
137 	unsigned short a : 1;
138 	unsigned char : 0;
139 	unsigned long : 0;
140 	unsigned short c : 1;
141 } H;
142 
143 // CHECK:*** Dumping AST Record Layout
144 // CHECK-NEXT:      0 | struct H
145 // CHECK-NEXT:  0:0-0 |   unsigned short a
146 // CHECK-NEXT:    2:- |   unsigned char
147 // CHECK-NEXT:    2:- |   unsigned long
148 // CHECK-NEXT:  2:0-0 |   unsigned short c
149 // CHECK-NEXT:        | [sizeof=4, align=2]
150 
151 typedef struct I {
152 	short : 8;
153 	__declspec(align(16)) short : 8;
154 } I;
155 
156 
157 // CHECK:*** Dumping AST Record Layout
158 // CHECK-NEXT:      0 | struct I
159 // CHECK-NEXT:  0:0-7 |   short
160 // CHECK-NEXT:  1:0-7 |   short
161 // CHECK-NEXT:        | [sizeof=2, align=2]
162 
163 #pragma pack(push, 1)
164 
165 typedef struct A1 {
166 	char x;
167 	int a : 22;
168 	int : 0;
169 	int c : 10;
170 	char b : 3;
171 	char d: 4;
172 	short y;
173 } A1;
174 
175 // CHECK:*** Dumping AST Record Layout
176 // CHECK-NEXT:      0 | struct A1
177 // CHECK-NEXT:      0 |   char x
178 // CHECK-NEXT: 1:0-21 |   int a
179 // CHECK-NEXT:    5:- |   int
180 // CHECK-NEXT:  5:0-9 |   int c
181 // CHECK-NEXT:  9:0-2 |   char b
182 // CHECK-NEXT:  9:3-6 |   char d
183 // CHECK-NEXT:     10 |   short y
184 // CHECK-NEXT:        | [sizeof=12, align=1]
185 
186 typedef struct B1 {
187 	char x;
188 	int : 0;
189 	short a : 4;
190 	char y;
191 } B1;
192 
193 // CHECK:*** Dumping AST Record Layout
194 // CHECK-NEXT:      0 | struct B1
195 // CHECK-NEXT:      0 |   char x
196 // CHECK-NEXT:    1:- |   int
197 // CHECK-NEXT:  1:0-3 |   short
198 // CHECK-NEXT:      3 |   char y
199 // CHECK-NEXT:        | [sizeof=4, align=1]
200 
201 typedef struct C1 {
202 	char x;
203 	short a : 4;
204 	int : 0;
205 	char y;
206 } C1;
207 
208 // CHECK:*** Dumping AST Record Layout
209 // CHECK-NEXT:      0 | struct C1
210 // CHECK-NEXT:      0 |   char x
211 // CHECK-NEXT:  1:0-3 |   short
212 // CHECK-NEXT:    3:- |   int
213 // CHECK-NEXT:      3 |   char y
214 // CHECK-NEXT:        | [sizeof=4, align=1]
215 
216 typedef struct D1 {
217 	char x;
218 	short : 0;
219 	int : 0;
220 	char y;
221 } D1;
222 
223 // CHECK:*** Dumping AST Record Layout
224 // CHECK-NEXT:      0 | struct D1
225 // CHECK-NEXT:      0 |   char x
226 // CHECK-NEXT:    1:- |   short
227 // CHECK-NEXT:    1:- |   int
228 // CHECK-NEXT:      1 |   char y
229 // CHECK-NEXT:        | [sizeof=2, align=1]
230 
231 typedef union E1 {
232 	char x;
233 	long long a : 3;
234 	int b : 3;
235 	long long : 0;
236 	short y;
237 } E1;
238 
239 // CHECK:*** Dumping AST Record Layout
240 // CHECK-NEXT:      0 | union E1
241 // CHECK-NEXT:      0 |   char x
242 // CHECK-NEXT:  0:0-2 |   long long a
243 // CHECK-NEXT:  0:0-2 |   int b
244 // CHECK-NEXT:    0:- |   long long
245 // CHECK-NEXT:      0 |   short y
246 // CHECK-NEXT:        | [sizeof=8, align=1]
247 
248 typedef struct F1 {
249 	char x;
250 	char a : 3;
251 	char b : 3;
252 	char c : 3;
253 	short d : 6;
254 	short e : 6;
255 	short f : 6;
256 	short g : 11;
257 	short h : 11;
258 	short i : 11;
259 	short y;
260 } F1;
261 
262 // CHECK:*** Dumping AST Record Layout
263 // CHECK-NEXT:      0 | struct F1
264 // CHECK-NEXT:      0 |   char x
265 // CHECK-NEXT:  1:0-2 |   char a
266 // CHECK-NEXT:  1:3-5 |   char b
267 // CHECK-NEXT:  2:0-2 |   char c
268 // CHECK-NEXT:  3:0-5 |   short d
269 // CHECK-NEXT: 3:6-11 |   short e
270 // CHECK-NEXT:  5:0-5 |   short f
271 // CHECK-NEXT: 7:0-10 |   short g
272 // CHECK-NEXT: 9:0-10 |   short h
273 // CHECK-NEXT:11:0-10 |   short i
274 // CHECK-NEXT:     13 |   short y
275 // CHECK-NEXT:        | [sizeof=15, align=1]
276 
277 typedef union G1 {
278 	char x;
279 	int a : 3;
280 	int : 0;
281 	long long : 0;
282 	short y;
283 } G1;
284 
285 // CHECK:*** Dumping AST Record Layout
286 // CHECK-NEXT:      0 | union G1
287 // CHECK-NEXT:      0 |   char x
288 // CHECK-NEXT:  0:0-2 |   int a
289 // CHECK-NEXT:    0:- |   int
290 // CHECK-NEXT:    0:- |   long long
291 // CHECK-NEXT:      0 |   short y
292 // CHECK-NEXT:        | [sizeof=4, align=1]
293 
294 typedef struct H1 {
295 	unsigned long a : 1;
296 	unsigned char : 0;
297 	unsigned long : 0;
298 	unsigned long c : 1;
299 } H1;
300 
301 // CHECK:*** Dumping AST Record Layout
302 // CHECK-NEXT:      0 | struct H1
303 // CHECK-NEXT:  0:0-0 |   unsigned long a
304 // CHECK-NEXT:    4:- |   unsigned char
305 // CHECK-NEXT:    4:- |   unsigned long
306 // CHECK-NEXT:  4:0-0 |   unsigned long c
307 // CHECK-NEXT:        | [sizeof=8, align=1]
308 
309 typedef struct I1 {
310 	short : 8;
311 	__declspec(align(16)) short : 8;
312 } I1;
313 
314 // CHECK:*** Dumping AST Record Layout
315 // CHECK-NEXT:      0 | struct I1
316 // CHECK-NEXT:  0:0-7 |   short
317 // CHECK-NEXT:  1:0-7 |   short
318 // CHECK-NEXT:        | [sizeof=2, align=1]
319 
320 #pragma pack(pop)
321 
322 int x[
323 sizeof(A ) +
324 sizeof(B ) +
325 sizeof(C ) +
326 sizeof(D ) +
327 sizeof(E ) +
328 sizeof(F ) +
329 sizeof(G ) +
330 sizeof(H ) +
331 sizeof(I ) +
332 sizeof(A1) +
333 sizeof(B1) +
334 sizeof(C1) +
335 sizeof(D1) +
336 sizeof(E1) +
337 sizeof(F1) +
338 sizeof(G1) +
339 sizeof(H1) +
340 sizeof(I1) +
341 0];
342