ms_bitfield_layout.c revision dc58180432868cfa9c060d5c41114634e4b841c7
1// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -cxx-abi microsoft -fdump-record-layouts %s 2>/dev/null \
2// RUN:            | FileCheck %s
3
4typedef struct A {
5	char x;
6	int a : 22;
7	int : 0;
8	int c : 10;
9	char b : 3;
10	char d: 4;
11	short y;
12} A;
13
14// CHECK: Type: struct A
15// CHECK:   Size:128
16// CHECK:   Alignment:32
17// CHECK:   FieldOffsets: [0, 32, 64, 64, 96, 99, 112]>
18
19typedef struct B {
20	char x;
21	int : 0;
22	short a : 4;
23	char y;
24} B;
25
26// CHECK: Type: struct B
27// CHECK:   Size:48
28// CHECK:   Alignment:16
29// CHECK:   FieldOffsets: [0, 8, 16, 32]>
30
31typedef struct C {
32	char x;
33	short a : 4;
34	int : 0;
35	char y;
36} C;
37
38// CHECK: Type: struct C
39// CHECK:   Size:64
40// CHECK:   Alignment:32
41// CHECK:   FieldOffsets: [0, 16, 32, 32]>
42
43typedef struct D {
44	char x;
45	short : 0;
46	int : 0;
47	char y;
48} D;
49
50// CHECK: Type: struct D
51// CHECK:   Size:16
52// CHECK:   Alignment:8
53// CHECK:   FieldOffsets: [0, 8, 8, 8]>
54
55typedef union E {
56	char x;
57	long long a : 3;
58	int b : 3;
59	long long : 0;
60	short y;
61} E;
62
63// CHECK: Type: union E
64// CHECK:   Size:64
65// CHECK:   Alignment:16
66// CHECK:   FieldOffsets: [0, 0, 0, 0, 0]>
67
68typedef struct F {
69	char x;
70	char a : 3;
71	char b : 3;
72	char c : 3;
73	short d : 6;
74	short e : 6;
75	short f : 6;
76	short g : 11;
77	short h : 11;
78	short i : 11;
79	short y;
80} F;
81
82// CHECK: Type: struct F
83// CHECK:   Size:128
84// CHECK:   Alignment:16
85// CHECK:   FieldOffsets: [0, 8, 11, 16, 32, 38, 48, 64, 80, 96, 112]>
86
87typedef union G {
88	char x;
89	int a : 3;
90	int : 0;
91	long long : 0;
92	short y;
93} G;
94
95// CHECK: Type: union G
96// CHECK:   Size:32
97// CHECK:   Alignment:16
98// CHECK:   FieldOffsets: [0, 0, 0, 0, 0]>
99
100typedef struct H {
101	unsigned short a : 1;
102	unsigned char : 0;
103	unsigned long : 0;
104	unsigned short c : 1;
105} H;
106
107// CHECK: Type: struct H
108// CHECK:   Size:32
109// CHECK:   Alignment:16
110// CHECK:   FieldOffsets: [0, 16, 16, 16]>
111
112#pragma pack(push, 1)
113
114typedef struct A1 {
115	char x;
116	int a : 22;
117	int : 0;
118	int c : 10;
119	char b : 3;
120	char d: 4;
121	short y;
122} A1;
123
124// CHECK: Type: struct A1
125// CHECK:   Size:96
126// CHECK:   Alignment:8
127// CHECK:   FieldOffsets: [0, 8, 40, 40, 72, 75, 80]>
128
129typedef struct B1 {
130	char x;
131	int : 0;
132	short a : 4;
133	char y;
134} B1;
135
136// CHECK: Type: struct B1
137// CHECK:   Size:32
138// CHECK:   Alignment:8
139// CHECK:   FieldOffsets: [0, 8, 8, 24]>
140
141typedef struct C1 {
142	char x;
143	short a : 4;
144	int : 0;
145	char y;
146} C1;
147
148// CHECK: Type: struct C1
149// CHECK:   Size:32
150// CHECK:   Alignment:8
151// CHECK:   FieldOffsets: [0, 8, 24, 24]>
152
153typedef struct D1 {
154	char x;
155	short : 0;
156	int : 0;
157	char y;
158} D1;
159
160// CHECK: Type: struct D1
161// CHECK:   Size:16
162// CHECK:   Alignment:8
163// CHECK:   FieldOffsets: [0, 8, 8, 8]>
164
165typedef union E1 {
166	char x;
167	long long a : 3;
168	int b : 3;
169	long long : 0;
170	short y;
171} E1;
172
173// CHECK: Type: union E1
174// CHECK:   Size:64
175// CHECK:   Alignment:8
176// CHECK:   FieldOffsets: [0, 0, 0, 0, 0]>
177
178typedef struct F1 {
179	char x;
180	char a : 3;
181	char b : 3;
182	char c : 3;
183	short d : 6;
184	short e : 6;
185	short f : 6;
186	short g : 11;
187	short h : 11;
188	short i : 11;
189	short y;
190} F1;
191
192// CHECK: Type: struct F1
193// CHECK:   Size:120
194// CHECK:   Alignment:8
195// CHECK:   FieldOffsets: [0, 8, 11, 16, 24, 30, 40, 56, 72, 88, 104]>
196
197typedef union G1 {
198	char x;
199	int a : 3;
200	int : 0;
201	long long : 0;
202	short y;
203} G1;
204
205// CHECK: Type: union G1
206// CHECK:   Size:32
207// CHECK:   Alignment:8
208// CHECK:   FieldOffsets: [0, 0, 0, 0, 0]>
209
210typedef struct H1 {
211	unsigned long a : 1;
212	unsigned char : 0;
213	unsigned long : 0;
214	unsigned long c : 1;
215} H1;
216
217// CHECK: Type: struct H1
218// CHECK:   Size:64
219// CHECK:   Alignment:8
220// CHECK:   FieldOffsets: [0, 32, 32, 32]>
221
222#pragma pack(pop)
223
224int x[
225sizeof(A ) +
226sizeof(B ) +
227sizeof(C ) +
228sizeof(D ) +
229sizeof(E ) +
230sizeof(F ) +
231sizeof(G ) +
232sizeof(H ) +
233sizeof(A1) +
234sizeof(B1) +
235sizeof(C1) +
236sizeof(D1) +
237sizeof(E1) +
238sizeof(F1) +
239sizeof(G1) +
240sizeof(H1) +
2410];
242