blob: 8d377bc28d496ca0be61e82a57a6e621e11e24da [file] [log] [blame]
NAKAMURA Takumi729be142014-10-27 12:37:26 +00001// 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
6typedef 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
John McCall0d461692015-08-19 22:42:36 +000016// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +000026
27typedef struct B {
28 char x;
29 int : 0;
30 short a : 4;
31 char y;
32} B;
33
John McCall0d461692015-08-19 22:42:36 +000034// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +000041
42typedef struct C {
43 char x;
44 short a : 4;
45 int : 0;
46 char y;
47} C;
48
John McCall0d461692015-08-19 22:42:36 +000049// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +000056
57typedef struct D {
58 char x;
59 short : 0;
60 int : 0;
61 char y;
62} D;
63
John McCall0d461692015-08-19 22:42:36 +000064// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +000071
72typedef union E {
73 char x;
74 long long a : 3;
75 int b : 3;
76 long long : 0;
77 short y;
78} E;
79
John McCall0d461692015-08-19 22:42:36 +000080
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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +000089
90typedef 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
John McCall0d461692015-08-19 22:42:36 +0000104// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000118
119typedef union G {
120 char x;
121 int a : 3;
122 int : 0;
123 long long : 0;
124 short y;
125} G;
126
John McCall0d461692015-08-19 22:42:36 +0000127// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000135
136typedef struct H {
137 unsigned short a : 1;
138 unsigned char : 0;
139 unsigned long : 0;
140 unsigned short c : 1;
141} H;
142
John McCall0d461692015-08-19 22:42:36 +0000143// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000150
151typedef struct I {
152 short : 8;
153 __declspec(align(16)) short : 8;
154} I;
155
John McCall0d461692015-08-19 22:42:36 +0000156
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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000162
163#pragma pack(push, 1)
164
165typedef 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
John McCall0d461692015-08-19 22:42:36 +0000175// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000185
186typedef struct B1 {
187 char x;
188 int : 0;
189 short a : 4;
190 char y;
191} B1;
192
John McCall0d461692015-08-19 22:42:36 +0000193// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000200
201typedef struct C1 {
202 char x;
203 short a : 4;
204 int : 0;
205 char y;
206} C1;
207
John McCall0d461692015-08-19 22:42:36 +0000208// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000215
216typedef struct D1 {
217 char x;
218 short : 0;
219 int : 0;
220 char y;
221} D1;
222
John McCall0d461692015-08-19 22:42:36 +0000223// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000230
231typedef union E1 {
232 char x;
233 long long a : 3;
234 int b : 3;
235 long long : 0;
236 short y;
237} E1;
238
John McCall0d461692015-08-19 22:42:36 +0000239// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000247
248typedef 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
John McCall0d461692015-08-19 22:42:36 +0000262// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000276
277typedef union G1 {
278 char x;
279 int a : 3;
280 int : 0;
281 long long : 0;
282 short y;
283} G1;
284
John McCall0d461692015-08-19 22:42:36 +0000285// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000293
294typedef struct H1 {
295 unsigned long a : 1;
296 unsigned char : 0;
297 unsigned long : 0;
298 unsigned long c : 1;
299} H1;
300
John McCall0d461692015-08-19 22:42:36 +0000301// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000308
309typedef struct I1 {
310 short : 8;
311 __declspec(align(16)) short : 8;
312} I1;
313
John McCall0d461692015-08-19 22:42:36 +0000314// 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]
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000319
320#pragma pack(pop)
321
322int x[
323sizeof(A ) +
324sizeof(B ) +
325sizeof(C ) +
326sizeof(D ) +
327sizeof(E ) +
328sizeof(F ) +
329sizeof(G ) +
330sizeof(H ) +
331sizeof(I ) +
332sizeof(A1) +
333sizeof(B1) +
334sizeof(C1) +
335sizeof(D1) +
336sizeof(E1) +
337sizeof(F1) +
338sizeof(G1) +
339sizeof(H1) +
340sizeof(I1) +
3410];