xref: /minix3/external/bsd/llvm/dist/clang/test/Sema/ms_bitfield_layout.c (revision 0b98e8aad89f2bd4ba80b523d73cf29e9dd82ce1)
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 
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: Type: struct A
17 // CHECK:   Size:128
18 // CHECK:   Alignment:32
19 // CHECK:   FieldOffsets: [0, 32, 64, 64, 96, 99, 112]>
20 
21 typedef 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 
33 typedef 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 
45 typedef 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 
57 typedef 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 
70 typedef 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 
89 typedef 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 
102 typedef 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 
116 typedef 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 
131 typedef 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 
143 typedef 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 
155 typedef 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 
167 typedef 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 
180 typedef 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 
199 typedef 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 
212 typedef 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 
226 int x[
227 sizeof(A ) +
228 sizeof(B ) +
229 sizeof(C ) +
230 sizeof(D ) +
231 sizeof(E ) +
232 sizeof(F ) +
233 sizeof(G ) +
234 sizeof(H ) +
235 sizeof(A1) +
236 sizeof(B1) +
237 sizeof(C1) +
238 sizeof(D1) +
239 sizeof(E1) +
240 sizeof(F1) +
241 sizeof(G1) +
242 sizeof(H1) +
243 0];
244