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