1 | // RUN: %clang -x c -fsanitize=implicit-bitfield-conversion -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK |
2 | // RUN: %clang -x c -fsanitize=implicit-bitfield-conversion -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK |
3 | // RUN: %clang -x c -fsanitize=implicit-bitfield-conversion -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK |
4 | // RUN: %clang -x c -fsanitize=implicit-bitfield-conversion -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK |
5 | // RUN: %clang -x c -fsanitize=implicit-conversion -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK |
6 | |
7 | // RUN: %clangxx -x c++ -fsanitize=implicit-bitfield-conversion -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK |
8 | // RUN: %clangxx -x c++ -fsanitize=implicit-bitfield-conversion -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK |
9 | // RUN: %clangxx -x c++ -fsanitize=implicit-bitfield-conversion -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK |
10 | // RUN: %clangxx -x c++ -fsanitize=implicit-bitfield-conversion -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK |
11 | // RUN: %clangxx -x c++ -fsanitize=implicit-conversion -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK |
12 | |
13 | #include <stdbool.h> |
14 | #include <stdint.h> |
15 | |
16 | #define UINT4_MIN 0 |
17 | #define UINT4_MAX (1 << 4) - 1 |
18 | #define UINT5_MIN 0 |
19 | #define UINT5_MAX (1 << 5) - 1 |
20 | #define INT7_MIN -(1 << 6) |
21 | #define INT7_MAX (1 << 6) - 1 |
22 | |
23 | typedef struct _X { |
24 | uint8_t a : 4; |
25 | uint32_t b : 5; |
26 | int8_t c : 7; |
27 | int32_t d : 16; |
28 | uint8_t e : 8; |
29 | uint16_t f : 16; |
30 | uint32_t g : 32; |
31 | int8_t h : 8; |
32 | int16_t i : 16; |
33 | int32_t j : 32; |
34 | uint32_t k : 1; |
35 | int32_t l : 1; |
36 | bool m : 1; |
37 | } X; |
38 | |
39 | void test_a() { |
40 | X x; |
41 | uint32_t min = UINT4_MIN; |
42 | uint32_t max = UINT4_MAX; |
43 | |
44 | uint8_t v8 = max + 1; |
45 | uint16_t v16 = (UINT8_MAX + 1) + (max + 1); |
46 | uint32_t v32 = (UINT8_MAX + 1) + (max + 1); |
47 | |
48 | // Assignment |
49 | x.a = v8; |
50 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint8_t' (aka 'unsigned char') of value 16 (8-bit, unsigned) to type 'uint8_t' (aka 'unsigned char') changed the value to 0 (4-bit bitfield, unsigned) |
51 | x.a = v16; |
52 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint16_t' (aka 'unsigned short') of value 272 (16-bit, unsigned) to type 'uint8_t' (aka 'unsigned char') changed the value to 0 (4-bit bitfield, unsigned) |
53 | x.a = v32; |
54 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 272 (32-bit, unsigned) to type 'uint8_t' (aka 'unsigned char') changed the value to 0 (4-bit bitfield, unsigned) |
55 | |
56 | // PrePostIncDec |
57 | x.a = min; |
58 | x.a--; |
59 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'uint8_t' (aka 'unsigned char') changed the value to 15 (4-bit bitfield, unsigned) |
60 | x.a = min; |
61 | --x.a; |
62 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'uint8_t' (aka 'unsigned char') changed the value to 15 (4-bit bitfield, unsigned) |
63 | |
64 | x.a = max; |
65 | x.a++; |
66 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int' of value 16 (32-bit, signed) to type 'uint8_t' (aka 'unsigned char') changed the value to 0 (4-bit bitfield, unsigned) |
67 | x.a = max; |
68 | ++x.a; |
69 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value 16 (32-bit, signed) to type 'uint8_t' (aka 'unsigned char') changed the value to 0 (4-bit bitfield, unsigned) |
70 | |
71 | x.a = min + 1; |
72 | x.a++; |
73 | x.a = min + 1; |
74 | ++x.a; |
75 | |
76 | x.a = min + 1; |
77 | x.a--; |
78 | x.a = min + 1; |
79 | --x.a; |
80 | |
81 | x.a = max - 1; |
82 | x.a++; |
83 | x.a = max - 1; |
84 | ++x.a; |
85 | |
86 | x.a = max - 1; |
87 | x.a--; |
88 | x.a = max - 1; |
89 | --x.a; |
90 | |
91 | // Compound assignment |
92 | x.a = 0; |
93 | x.a += max; |
94 | x.a = 0; |
95 | x.a += (max + 1); |
96 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 16 (32-bit, unsigned) to type 'uint8_t' (aka 'unsigned char') changed the value to 0 (4-bit bitfield, unsigned) |
97 | |
98 | x.a = max; |
99 | x.a -= max; |
100 | x.a = max; |
101 | x.a -= (max + 1); |
102 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 4294967295 (32-bit, unsigned) to type 'uint8_t' (aka 'unsigned char') changed the value to 15 (4-bit bitfield, unsigned) |
103 | |
104 | x.a = 1; |
105 | x.a *= max; |
106 | x.a = 1; |
107 | x.a *= (max + 1); |
108 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 16 (32-bit, unsigned) to type 'uint8_t' (aka 'unsigned char') changed the value to 0 (4-bit bitfield, unsigned) |
109 | } |
110 | |
111 | void test_b() { |
112 | X x; |
113 | uint32_t min = UINT5_MIN; |
114 | uint32_t max = UINT5_MAX; |
115 | |
116 | uint8_t v8 = max + 1; |
117 | uint16_t v16 = max + 1; |
118 | uint32_t v32 = max + 1; |
119 | |
120 | // Assignment |
121 | x.b = v8; |
122 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint8_t' (aka 'unsigned char') of value 32 (8-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 0 (5-bit bitfield, unsigned) |
123 | x.b = v16; |
124 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint16_t' (aka 'unsigned short') of value 32 (16-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 0 (5-bit bitfield, unsigned) |
125 | x.b = v32; |
126 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 32 (32-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 0 (5-bit bitfield, unsigned) |
127 | |
128 | // PrePostIncDec |
129 | x.b = min; |
130 | x.b--; |
131 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 4294967295 (32-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 31 (5-bit bitfield, unsigned) |
132 | x.b = min; |
133 | --x.b; |
134 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 4294967295 (32-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 31 (5-bit bitfield, unsigned) |
135 | |
136 | x.b = max; |
137 | x.b++; |
138 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 32 (32-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 0 (5-bit bitfield, unsigned) |
139 | x.b = max; |
140 | ++x.b; |
141 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 32 (32-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 0 (5-bit bitfield, unsigned) |
142 | |
143 | x.b = min + 1; |
144 | x.b++; |
145 | x.b = min + 1; |
146 | ++x.b; |
147 | |
148 | x.b = min + 1; |
149 | x.b--; |
150 | x.b = min + 1; |
151 | --x.b; |
152 | |
153 | x.b = max - 1; |
154 | x.b++; |
155 | x.b = max - 1; |
156 | ++x.b; |
157 | |
158 | x.b = max - 1; |
159 | x.b--; |
160 | x.b = max - 1; |
161 | --x.b; |
162 | |
163 | // Compound assignment |
164 | x.b = 0; |
165 | x.b += max; |
166 | x.b = 0; |
167 | x.b += (max + 1); |
168 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 32 (32-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 0 (5-bit bitfield, unsigned) |
169 | |
170 | x.b = max; |
171 | x.b -= max; |
172 | x.b = max; |
173 | x.b -= (max + 1); |
174 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 4294967295 (32-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 31 (5-bit bitfield, unsigned) |
175 | |
176 | x.b = 1; |
177 | x.b *= max; |
178 | x.b = 1; |
179 | x.b *= (max + 1); |
180 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 32 (32-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 0 (5-bit bitfield, unsigned) |
181 | } |
182 | |
183 | void test_c() { |
184 | X x; |
185 | int32_t min = INT7_MIN; |
186 | int32_t max = INT7_MAX; |
187 | |
188 | uint8_t v8 = max + 1; |
189 | uint16_t v16 = (UINT8_MAX + 1) + (max + 1); |
190 | uint32_t v32 = (UINT8_MAX + 1) + (max + 1); |
191 | |
192 | // Assignment |
193 | x.c = v8; |
194 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint8_t' (aka 'unsigned char') of value 64 (8-bit, unsigned) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to -64 (7-bit bitfield, signed) |
195 | x.c = v16; |
196 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint16_t' (aka 'unsigned short') of value 320 (16-bit, unsigned) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to -64 (7-bit bitfield, signed) |
197 | x.c = v32; |
198 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 320 (32-bit, unsigned) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to -64 (7-bit bitfield, signed) |
199 | |
200 | // PrePostIncDec |
201 | x.c = min; |
202 | x.c--; |
203 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int' of value -65 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to 63 (7-bit bitfield, signed) |
204 | x.c = min; |
205 | --x.c; |
206 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value -65 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to 63 (7-bit bitfield, signed) |
207 | |
208 | x.c = max; |
209 | x.c++; |
210 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int' of value 64 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to -64 (7-bit bitfield, signed) |
211 | x.c = max; |
212 | ++x.c; |
213 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value 64 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to -64 (7-bit bitfield, signed) |
214 | |
215 | x.c = min + 1; |
216 | x.c++; |
217 | x.c = min + 1; |
218 | ++x.c; |
219 | |
220 | x.c = min + 1; |
221 | x.c--; |
222 | x.c = min + 1; |
223 | --x.c; |
224 | |
225 | x.c = max - 1; |
226 | x.c++; |
227 | x.c = max - 1; |
228 | ++x.c; |
229 | |
230 | x.c = max - 1; |
231 | x.c--; |
232 | x.c = max - 1; |
233 | --x.c; |
234 | |
235 | // Compound assignment |
236 | x.c = 0; |
237 | x.c += max; |
238 | x.c = 0; |
239 | x.c += (max + 1); |
240 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int' of value 64 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to -64 (7-bit bitfield, signed) |
241 | |
242 | x.c = 0; |
243 | x.c -= (-min); |
244 | x.c = 0; |
245 | x.c -= (-min + 1); |
246 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int' of value -65 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to 63 (7-bit bitfield, signed) |
247 | |
248 | x.c = 1; |
249 | x.c *= max; |
250 | x.c = 1; |
251 | x.c *= (max + 1); |
252 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int' of value 64 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to -64 (7-bit bitfield, signed) |
253 | } |
254 | |
255 | void test_d() { |
256 | X x; |
257 | int32_t min = INT16_MIN; |
258 | int32_t max = INT16_MAX; |
259 | |
260 | uint32_t v32 = max + 1; |
261 | |
262 | // Assignment |
263 | x.d = v32; |
264 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 32768 (32-bit, unsigned) to type 'int32_t' (aka 'int') changed the value to -32768 (16-bit bitfield, signed) |
265 | |
266 | // PrePostIncDec |
267 | x.d = min; |
268 | x.d--; |
269 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int32_t' (aka 'int') of value -32769 (32-bit, signed) to type 'int32_t' (aka 'int') changed the value to 32767 (16-bit bitfield, signed) |
270 | x.d = min; |
271 | --x.d; |
272 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int32_t' (aka 'int') of value -32769 (32-bit, signed) to type 'int32_t' (aka 'int') changed the value to 32767 (16-bit bitfield, signed) |
273 | |
274 | x.d = max; |
275 | x.d++; |
276 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int32_t' (aka 'int') of value 32768 (32-bit, signed) to type 'int32_t' (aka 'int') changed the value to -32768 (16-bit bitfield, signed) |
277 | x.d = max; |
278 | ++x.d; |
279 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int32_t' (aka 'int') of value 32768 (32-bit, signed) to type 'int32_t' (aka 'int') changed the value to -32768 (16-bit bitfield, signed) |
280 | |
281 | x.d = min + 1; |
282 | x.d++; |
283 | x.d = min + 1; |
284 | ++x.d; |
285 | |
286 | x.d = min + 1; |
287 | x.d--; |
288 | x.d = min + 1; |
289 | --x.d; |
290 | |
291 | x.d = max - 1; |
292 | x.d++; |
293 | x.d = max - 1; |
294 | ++x.d; |
295 | |
296 | x.d = max - 1; |
297 | x.d--; |
298 | x.d = max - 1; |
299 | --x.d; |
300 | |
301 | // Compound assignment |
302 | x.d = 0; |
303 | x.d += max; |
304 | x.d = 0; |
305 | x.d += (max + 1); |
306 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int' of value 32768 (32-bit, signed) to type 'int32_t' (aka 'int') changed the value to -32768 (16-bit bitfield, signed) |
307 | |
308 | x.d = 0; |
309 | x.d -= (-min); |
310 | x.d = 0; |
311 | x.d -= (-min + 1); |
312 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int' of value -32769 (32-bit, signed) to type 'int32_t' (aka 'int') changed the value to 32767 (16-bit bitfield, signed) |
313 | |
314 | x.d = 1; |
315 | x.d *= max; |
316 | x.d = 1; |
317 | x.d *= (max + 1); |
318 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int' of value 32768 (32-bit, signed) to type 'int32_t' (aka 'int') changed the value to -32768 (16-bit bitfield, signed) |
319 | } |
320 | |
321 | void test_e() { |
322 | X x; |
323 | uint32_t min = 0; |
324 | uint32_t max = UINT8_MAX; |
325 | |
326 | uint16_t v16 = max + 1; |
327 | uint32_t v32 = max + 1; |
328 | |
329 | // Assignment |
330 | x.e = v16; |
331 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint16_t' (aka 'unsigned short') of value 256 (16-bit, unsigned) to type 'uint8_t' (aka 'unsigned char') changed the value to 0 (8-bit bitfield, unsigned) |
332 | x.e = v32; |
333 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 256 (32-bit, unsigned) to type 'uint8_t' (aka 'unsigned char') changed the value to 0 (8-bit bitfield, unsigned) |
334 | |
335 | // PrePostIncDec |
336 | x.e = min; |
337 | x.e--; |
338 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'uint8_t' (aka 'unsigned char') changed the value to 255 (8-bit bitfield, unsigned) |
339 | x.e = min; |
340 | --x.e; |
341 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'uint8_t' (aka 'unsigned char') changed the value to 255 (8-bit bitfield, unsigned) |
342 | x.e = min + 1; |
343 | x.e--; |
344 | |
345 | x.e = max; |
346 | x.e++; |
347 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int' of value 256 (32-bit, signed) to type 'uint8_t' (aka 'unsigned char') changed the value to 0 (8-bit bitfield, unsigned) |
348 | x.e = max; |
349 | ++x.e; |
350 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value 256 (32-bit, signed) to type 'uint8_t' (aka 'unsigned char') changed the value to 0 (8-bit bitfield, unsigned) |
351 | x.e = max - 1; |
352 | x.e++; |
353 | |
354 | // Compound assignment |
355 | x.e = 0; |
356 | x.e += max; |
357 | x.e = 0; |
358 | x.e += (max + 1); |
359 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 256 (32-bit, unsigned) to type 'uint8_t' (aka 'unsigned char') changed the value to 0 (8-bit bitfield, unsigned) |
360 | |
361 | x.e = max; |
362 | x.e -= max; |
363 | x.e = max; |
364 | x.e -= (max + 1); |
365 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 4294967295 (32-bit, unsigned) to type 'uint8_t' (aka 'unsigned char') changed the value to 255 (8-bit bitfield, unsigned) |
366 | } |
367 | |
368 | void test_f() { |
369 | X x; |
370 | uint32_t min = 0; |
371 | uint32_t max = UINT16_MAX; |
372 | |
373 | uint32_t v32 = max + 1; |
374 | |
375 | // Assignment |
376 | x.f = v32; |
377 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 65536 (32-bit, unsigned) to type 'uint16_t' (aka 'unsigned short') changed the value to 0 (16-bit bitfield, unsigned) |
378 | |
379 | // PrePostIncDec |
380 | x.f = min; |
381 | x.f--; |
382 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'uint16_t' (aka 'unsigned short') changed the value to 65535 (16-bit bitfield, unsigned) |
383 | x.f = min; |
384 | --x.f; |
385 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'uint16_t' (aka 'unsigned short') changed the value to 65535 (16-bit bitfield, unsigned) |
386 | x.f = min + 1; |
387 | x.f--; |
388 | |
389 | x.f = max; |
390 | x.f++; |
391 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int' of value 65536 (32-bit, signed) to type 'uint16_t' (aka 'unsigned short') changed the value to 0 (16-bit bitfield, unsigned) |
392 | x.f = max; |
393 | ++x.f; |
394 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value 65536 (32-bit, signed) to type 'uint16_t' (aka 'unsigned short') changed the value to 0 (16-bit bitfield, unsigned) |
395 | x.f = max - 1; |
396 | x.f++; |
397 | |
398 | // Compound assignment |
399 | x.f = 0; |
400 | x.f += max; |
401 | x.f = 0; |
402 | x.f += (max + 1); |
403 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 65536 (32-bit, unsigned) to type 'uint16_t' (aka 'unsigned short') changed the value to 0 (16-bit bitfield, unsigned) |
404 | |
405 | x.f = max; |
406 | x.f -= max; |
407 | x.f = max; |
408 | x.f -= (max + 1); |
409 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 4294967295 (32-bit, unsigned) to type 'uint16_t' (aka 'unsigned short') changed the value to 65535 (16-bit bitfield, unsigned) |
410 | } |
411 | |
412 | void test_g() { |
413 | X x; |
414 | uint64_t min = 0; |
415 | uint64_t max = UINT32_MAX; |
416 | |
417 | uint64_t v64 = max + 1; |
418 | |
419 | // Assignment |
420 | x.g = v64; |
421 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint64_t' (aka 'unsigned long{{( long)?}}') of value 4294967296 (64-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 0 (32-bit bitfield, unsigned) |
422 | |
423 | // PrePostIncDec |
424 | x.g = min; |
425 | x.g--; |
426 | x.g = min; |
427 | --x.g; |
428 | x.g = min + 1; |
429 | x.g--; |
430 | |
431 | x.g = max; |
432 | x.g++; |
433 | x.g = max; |
434 | ++x.g; |
435 | x.g = max - 1; |
436 | x.g++; |
437 | |
438 | // Compound assignment |
439 | x.g = 0; |
440 | x.g += max; |
441 | x.g = 0; |
442 | x.g += (max + 1); |
443 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint64_t' (aka 'unsigned long{{( long)?}}') of value 4294967296 (64-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 0 (32-bit bitfield, unsigned) |
444 | |
445 | x.g = max; |
446 | x.g -= max; |
447 | x.g = max; |
448 | x.g -= (max + 1); |
449 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint64_t' (aka 'unsigned long{{( long)?}}') of value 18446744073709551615 (64-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 4294967295 (32-bit bitfield, unsigned) |
450 | } |
451 | |
452 | void test_h() { |
453 | X x; |
454 | int32_t min = INT8_MIN; |
455 | int32_t max = INT8_MAX; |
456 | |
457 | int16_t v16 = max + 1; |
458 | int32_t v32 = max + 1; |
459 | |
460 | // Assignment |
461 | x.h = v16; |
462 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int16_t' (aka 'short') of value 128 (16-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to -128 (8-bit bitfield, signed) |
463 | x.h = v32; |
464 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int32_t' (aka 'int') of value 128 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to -128 (8-bit bitfield, signed) |
465 | |
466 | // PrePostIncDec |
467 | x.h = min; |
468 | x.h--; |
469 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int' of value -129 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to 127 (8-bit bitfield, signed) |
470 | x.h = min; |
471 | --x.h; |
472 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value -129 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to 127 (8-bit bitfield, signed) |
473 | x.h = min + 1; |
474 | x.h--; |
475 | |
476 | x.h = max; |
477 | x.h++; |
478 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int' of value 128 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to -128 (8-bit bitfield, signed) |
479 | x.h = max; |
480 | ++x.h; |
481 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value 128 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to -128 (8-bit bitfield, signed) |
482 | x.h = max - 1; |
483 | x.h++; |
484 | |
485 | // Compound assignment |
486 | x.h = 0; |
487 | x.h += max; |
488 | x.h = 0; |
489 | x.h += (max + 1); |
490 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int' of value 128 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to -128 (8-bit bitfield, signed) |
491 | |
492 | x.h = 0; |
493 | x.h -= (-min); |
494 | x.h = 0; |
495 | x.h -= (-min + 1); |
496 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int' of value -129 (32-bit, signed) to type 'int8_t' (aka '{{(signed )?}}char') changed the value to 127 (8-bit bitfield, signed) |
497 | } |
498 | |
499 | void test_i() { |
500 | X x; |
501 | int32_t min = INT16_MIN; |
502 | int32_t max = INT16_MAX; |
503 | |
504 | int32_t v32 = max + 1; |
505 | |
506 | // Assignment |
507 | x.i = v32; |
508 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int32_t' (aka 'int') of value 32768 (32-bit, signed) to type 'int16_t' (aka 'short') changed the value to -32768 (16-bit bitfield, signed) |
509 | |
510 | // PrePostIncDec |
511 | x.i = min; |
512 | x.i--; |
513 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int' of value -32769 (32-bit, signed) to type 'int16_t' (aka 'short') changed the value to 32767 (16-bit bitfield, signed) |
514 | x.i = min; |
515 | --x.i; |
516 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value -32769 (32-bit, signed) to type 'int16_t' (aka 'short') changed the value to 32767 (16-bit bitfield, signed) |
517 | x.i = min + 1; |
518 | x.i--; |
519 | |
520 | x.i = max; |
521 | x.i++; |
522 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int' of value 32768 (32-bit, signed) to type 'int16_t' (aka 'short') changed the value to -32768 (16-bit bitfield, signed) |
523 | x.i = max; |
524 | ++x.i; |
525 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value 32768 (32-bit, signed) to type 'int16_t' (aka 'short') changed the value to -32768 (16-bit bitfield, signed) |
526 | x.i = max - 1; |
527 | x.i++; |
528 | |
529 | // Compound assignment |
530 | x.i = 0; |
531 | x.i += max; |
532 | x.i = 0; |
533 | x.i += (max + 1); |
534 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int' of value 32768 (32-bit, signed) to type 'int16_t' (aka 'short') changed the value to -32768 (16-bit bitfield, signed) |
535 | |
536 | x.i = 0; |
537 | x.i -= (-min); |
538 | x.i = 0; |
539 | x.i -= (-min + 1); |
540 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int' of value -32769 (32-bit, signed) to type 'int16_t' (aka 'short') changed the value to 32767 (16-bit bitfield, signed) |
541 | } |
542 | |
543 | void test_j() { |
544 | X x; |
545 | int64_t min = INT32_MIN; |
546 | int64_t max = INT32_MAX; |
547 | |
548 | int64_t v64 = max + 1; |
549 | |
550 | // Assignment |
551 | x.j = v64; |
552 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int64_t' (aka 'long{{( long)?}}') of value 2147483648 (64-bit, signed) to type 'int32_t' (aka 'int') changed the value to -2147483648 (32-bit bitfield, signed) |
553 | |
554 | // PrePostIncDec |
555 | x.j = min; |
556 | x.j--; |
557 | x.j = min; |
558 | --x.j; |
559 | x.j = min + 1; |
560 | x.j--; |
561 | |
562 | x.j = max; |
563 | x.j++; |
564 | x.j = max; |
565 | ++x.j; |
566 | x.j = max - 1; |
567 | x.j++; |
568 | |
569 | // Compound assignment |
570 | x.j = 0; |
571 | x.j += max; |
572 | x.j = 0; |
573 | x.j += (max + 1); |
574 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int64_t' (aka 'long{{( long)?}}') of value 2147483648 (64-bit, signed) to type 'int32_t' (aka 'int') changed the value to -2147483648 (32-bit bitfield, signed) |
575 | |
576 | x.j = 0; |
577 | x.j -= (-min); |
578 | x.j = 0; |
579 | x.j -= (-min + 1); |
580 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int64_t' (aka 'long{{( long)?}}') of value -2147483649 (64-bit, signed) to type 'int32_t' (aka 'int') changed the value to 2147483647 (32-bit bitfield, signed) |
581 | } |
582 | |
583 | void test_k_l() { |
584 | X x; |
585 | int32_t one = 1; |
586 | int32_t neg_one = -1; |
587 | |
588 | // k |
589 | uint8_t v8 = 2; |
590 | x.k = v8; |
591 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint8_t' (aka 'unsigned char') of value 2 (8-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 0 (1-bit bitfield, unsigned) |
592 | x.k = one; |
593 | x.k = neg_one; |
594 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int32_t' (aka 'int') of value -1 (32-bit, signed) to type 'uint32_t' (aka 'unsigned int') changed the value to 1 (1-bit bitfield, unsigned) |
595 | |
596 | x.k = 0; |
597 | x.k--; |
598 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 4294967295 (32-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 1 (1-bit bitfield, unsigned) |
599 | x.k = 1; |
600 | x.k--; |
601 | |
602 | x.k = 1; |
603 | x.k++; |
604 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 2 (32-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 0 (1-bit bitfield, unsigned) |
605 | x.k = 0; |
606 | x.k++; |
607 | |
608 | // l |
609 | x.l = v8; |
610 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'uint8_t' (aka 'unsigned char') of value 2 (8-bit, unsigned) to type 'int32_t' (aka 'int') changed the value to 0 (1-bit bitfield, signed) |
611 | x.l = one; |
612 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:7: runtime error: implicit conversion from type 'int32_t' (aka 'int') of value 1 (32-bit, signed) to type 'int32_t' (aka 'int') changed the value to -1 (1-bit bitfield, signed) |
613 | x.l = neg_one; |
614 | |
615 | x.l = 0; |
616 | x.l--; |
617 | x.l = -1; |
618 | x.l--; |
619 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int32_t' (aka 'int') of value -2 (32-bit, signed) to type 'int32_t' (aka 'int') changed the value to 0 (1-bit bitfield, signed) |
620 | |
621 | x.l = 0; |
622 | x.l++; |
623 | // CHECK: {{.*}}bitfield-conversion.c:[[@LINE-1]]:6: runtime error: implicit conversion from type 'int32_t' (aka 'int') of value 1 (32-bit, signed) to type 'int32_t' (aka 'int') changed the value to -1 (1-bit bitfield, signed) |
624 | x.l = -1; |
625 | x.l++; |
626 | } |
627 | |
628 | void test_m() { |
629 | X x; |
630 | |
631 | uint8_t v8 = 2; |
632 | x.m = v8; |
633 | } |
634 | |
635 | int main() { |
636 | test_a(); |
637 | test_b(); |
638 | test_c(); |
639 | test_d(); |
640 | test_e(); |
641 | test_f(); |
642 | test_g(); |
643 | test_h(); |
644 | test_i(); |
645 | test_j(); |
646 | test_k_l(); |
647 | test_m(); |
648 | return 0; |
649 | } |
650 | |