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
23typedef 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
39void 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
111void 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
183void 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
255void 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
321void 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
368void 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
412void 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
452void 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
499void 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
543void 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
583void 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
628void test_m() {
629 X x;
630
631 uint8_t v8 = 2;
632 x.m = v8;
633}
634
635int 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

source code of compiler-rt/test/ubsan/TestCases/ImplicitConversion/bitfield-conversion.c