Clang Project

clang_source_code/test/Sema/ms_bitfield_layout.c
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
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
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
27typedef 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
42typedef 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
57typedef 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
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
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
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
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
119typedef 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
136typedef 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
151typedef 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
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
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
186typedef 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
201typedef 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
216typedef 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
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
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
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
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
277typedef 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
294typedef 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
309typedef 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
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];
342