1 // RUN: %clang_cc1 -fsyntax-only -verify -Wconversion \
2 // RUN: -nostdsysteminc -nobuiltininc -isystem %S/Inputs \
3 // RUN: -triple x86_64-apple-darwin %s -Wno-unreachable-code
5 #include <conversion.h>
7 #define BIG 0x7f7f7f7f7f7f7f7fL
9 void test0(char c
, short s
, int i
, long l
, long long ll
) {
11 c
= s
; // expected-warning {{implicit conversion loses integer precision}}
12 c
= i
; // expected-warning {{implicit conversion loses integer precision}}
13 c
= l
; // expected-warning {{implicit conversion loses integer precision}}
16 s
= i
; // expected-warning {{implicit conversion loses integer precision}}
17 s
= l
; // expected-warning {{implicit conversion loses integer precision}}
21 i
= l
; // expected-warning {{implicit conversion loses integer precision}}
45 c
= (short) BIG
; // expected-warning {{implicit conversion from 'short' to 'char' changes value}}
46 c
= (int) BIG
; // expected-warning {{implicit conversion from 'int' to 'char' changes value}}
47 c
= (long) BIG
; // expected-warning {{implicit conversion from 'long' to 'char' changes value}}
50 s
= (int) BIG
; // expected-warning {{implicit conversion from 'int' to 'short' changes value}}
51 s
= (long) BIG
; // expected-warning {{implicit conversion from 'long' to 'short' changes value}}
55 i
= (long) BIG
; // expected-warning {{implicit conversion from 'long' to 'int' changes value}}
62 char test1(long long ll
) {
63 return (long long) ll
; // expected-warning {{implicit conversion loses integer precision}}
65 char test1_a(long long ll
) {
66 return (long) ll
; // expected-warning {{implicit conversion loses integer precision}}
68 char test1_b(long long ll
) {
69 return (int) ll
; // expected-warning {{implicit conversion loses integer precision}}
71 char test1_c(long long ll
) {
72 return (short) ll
; // expected-warning {{implicit conversion loses integer precision}}
74 char test1_d(long long ll
) {
77 char test1_e(long long ll
) {
78 return (long long) BIG
; // expected-warning {{implicit conversion from 'long long' to 'char' changes value}}
80 char test1_f(long long ll
) {
81 return (long) BIG
; // expected-warning {{implicit conversion from 'long' to 'char' changes value}}
83 char test1_g(long long ll
) {
84 return (int) BIG
; // expected-warning {{implicit conversion from 'int' to 'char' changes value}}
86 char test1_h(long long ll
) {
87 return (short) BIG
; // expected-warning {{implicit conversion from 'short' to 'char' changes value}}
89 char test1_i(long long ll
) {
93 short test2(long long ll
) {
94 return (long long) ll
; // expected-warning {{implicit conversion loses integer precision}}
96 short test2_a(long long ll
) {
97 return (long) ll
; // expected-warning {{implicit conversion loses integer precision}}
99 short test2_b(long long ll
) {
100 return (int) ll
; // expected-warning {{implicit conversion loses integer precision}}
102 short test2_c(long long ll
) {
105 short test2_d(long long ll
) {
108 short test2_e(long long ll
) {
109 return (long long) BIG
; // expected-warning {{implicit conversion from 'long long' to 'short' changes value}}
111 short test2_f(long long ll
) {
112 return (long) BIG
; // expected-warning {{implicit conversion from 'long' to 'short' changes value}}
114 short test2_g(long long ll
) {
115 return (int) BIG
; // expected-warning {{implicit conversion from 'int' to 'short' changes value}}
117 short test2_h(long long ll
) {
120 short test2_i(long long ll
) {
124 int test3(long long ll
) {
125 return (long long) ll
; // expected-warning {{implicit conversion loses integer precision}}
127 int test3_b(long long ll
) {
128 return (long) ll
; // expected-warning {{implicit conversion loses integer precision}}
130 int test3_c(long long ll
) {
133 int test3_d(long long ll
) {
136 int test3_e(long long ll
) {
139 int test3_f(long long ll
) {
140 return (long long) BIG
; // expected-warning {{implicit conversion from 'long long' to 'int' changes value}}
142 int test3_g(long long ll
) {
143 return (long) BIG
; // expected-warning {{implicit conversion from 'long' to 'int' changes value}}
145 int test3_h(long long ll
) {
148 int test3_i(long long ll
) {
151 int test3_j(long long ll
) {
155 long test4(long long ll
) {
156 return (long long) ll
;
158 long test4_a(long long ll
) {
161 long test4_b(long long ll
) {
164 long test4_c(long long ll
) {
167 long test4_d(long long ll
) {
170 long test4_e(long long ll
) {
171 return (long long) BIG
;
173 long test4_f(long long ll
) {
176 long test4_g(long long ll
) {
179 long test4_h(long long ll
) {
182 long test4_i(long long ll
) {
186 long long test5(long long ll
) {
187 return (long long) ll
;
192 return (long long) BIG
;
199 void takes_char(char);
200 void takes_short(short);
202 void takes_long(long);
203 void takes_longlong(long long);
204 void takes_float(float);
205 void takes_double(double);
206 void takes_longdouble(long double);
219 void test7(short v
) {
220 takes_char(v
); // expected-warning {{implicit conversion loses integer precision}}
231 takes_char(v
); // expected-warning {{implicit conversion loses integer precision}}
232 takes_short(v
); // expected-warning {{implicit conversion loses integer precision}}
236 takes_float(v
); // expected-warning {{implicit conversion from 'int' to 'float' may lose precision}}
242 takes_char(v
); // expected-warning {{implicit conversion loses integer precision}}
243 takes_short(v
); // expected-warning {{implicit conversion loses integer precision}}
244 takes_int(v
); // expected-warning {{implicit conversion loses integer precision}}
247 takes_float(v
); // expected-warning {{implicit conversion from 'long' to 'float' may lose precision}}
248 takes_double(v
); // expected-warning {{implicit conversion from 'long' to 'double' may lose precision}}
252 void test10(long long v
) {
253 takes_char(v
); // expected-warning {{implicit conversion loses integer precision}}
254 takes_short(v
); // expected-warning {{implicit conversion loses integer precision}}
255 takes_int(v
); // expected-warning {{implicit conversion loses integer precision}}
258 takes_float(v
); // expected-warning {{implicit conversion from 'long long' to 'float' may lose precision}}
259 takes_double(v
); // expected-warning {{implicit conversion from 'long long' to 'double' may lose precision}}
263 void test11(float v
) {
264 takes_char(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
265 takes_short(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
266 takes_int(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
267 takes_long(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
268 takes_longlong(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
274 void test12(double v
) {
275 takes_char(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
276 takes_short(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
277 takes_int(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
278 takes_long(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
279 takes_longlong(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
280 takes_float(v
); // expected-warning {{implicit conversion loses floating-point precision}}
285 void test13(long double v
) {
286 takes_char(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
287 takes_short(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
288 takes_int(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
289 takes_long(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
290 takes_longlong(v
); // expected-warning {{implicit conversion turns floating-point number into integer}}
291 takes_float(v
); // expected-warning {{implicit conversion loses floating-point precision}}
292 takes_double(v
); // expected-warning {{implicit conversion loses floating-point precision}}
296 void test14(long l
) {
297 // Fine because of the boolean allowlist.
300 c
= ((l
<= 4) && (l
>= 0));
301 c
= ((l
<= 4) && (l
>= 0)) || (l
> 20);
304 void test15(char c
) {
306 c
= (short) c
+ 1 + c
* 2; // expected-warning {{implicit conversion loses integer precision}}
310 extern void *test16_external
;
312 int a
= (unsigned long) &test16_external
; // expected-warning {{implicit conversion loses integer precision}}
318 unsigned long long a
: 8;
319 unsigned long long b
: 32;
320 unsigned long long c
;
326 x
= U
.c
; // expected-warning {{implicit conversion loses integer precision}}
332 unsigned long long a
: 1;
333 unsigned long long b
;
341 // None of these should warn.
342 unsigned char test19(unsigned long u64
) {
343 unsigned char x1
= u64
& 0xff;
344 unsigned char x2
= u64
>> 56;
346 unsigned char mask
= 0xee;
347 unsigned char x3
= u64
& mask
;
351 void test_7631400(void) {
352 // This should show up despite the caret being inside a macro substitution
353 char s
= LONG_MAX
; // expected-warning {{implicit conversion from 'long' to 'char' changes value}}
356 // assertion for compound operators with non-integral RHS
358 void test_7676608(void) {
361 f7676608(c
*= q
); // expected-warning {{conversion}}
364 void test_7904686(void) {
366 unsigned u1
= i
; // expected-warning {{implicit conversion changes signedness}}
367 u1
= i
; // expected-warning {{implicit conversion changes signedness}}
369 unsigned u2
= -1; // expected-warning {{implicit conversion changes signedness}}
370 u2
= -1; // expected-warning {{implicit conversion changes signedness}}
373 // don't warn about conversions required by contexts in system headers
374 void test_8232669(void) {
381 #define USER_SETBIT(set,bit) do { int i = bit; set[i/(8*sizeof(set[0]))] |= (1 << (i%(8*sizeof(set)))); } while(0)
382 USER_SETBIT(bitset
, 0); // expected-warning 2 {{implicit conversion changes signedness}}
385 enum E8559831a
{ E8559831a_val
};
386 enum E8559831b
{ E8559831b_val
};
387 typedef enum { E8559831c_val
} E8559831c
;
388 enum { E8559831d_val
} value_d
;
390 void test_8559831_a(enum E8559831a value
);
391 void test_8559831(enum E8559831b value_a
, E8559831c value_c
) {
392 test_8559831_a(value_a
); // expected-warning{{implicit conversion from enumeration type 'enum E8559831b' to different enumeration type 'enum E8559831a'}}
393 enum E8559831a a1
= value_a
; // expected-warning{{implicit conversion from enumeration type 'enum E8559831b' to different enumeration type 'enum E8559831a'}}
394 a1
= value_a
; // expected-warning{{implicit conversion from enumeration type 'enum E8559831b' to different enumeration type 'enum E8559831a'}}
396 test_8559831_a(E8559831b_val
); // expected-warning{{implicit conversion from enumeration type 'enum E8559831b' to different enumeration type 'enum E8559831a'}}
397 enum E8559831a a1a
= E8559831b_val
; // expected-warning{{implicit conversion from enumeration type 'enum E8559831b' to different enumeration type 'enum E8559831a'}}
398 a1
= E8559831b_val
; // expected-warning{{implicit conversion from enumeration type 'enum E8559831b' to different enumeration type 'enum E8559831a'}}
400 test_8559831_a(value_c
); // expected-warning{{implicit conversion from enumeration type 'E8559831c' to different enumeration type 'enum E8559831a'}}
401 enum E8559831a a2
= value_c
; // expected-warning{{implicit conversion from enumeration type 'E8559831c' to different enumeration type 'enum E8559831a'}}
402 a2
= value_c
; // expected-warning{{implicit conversion from enumeration type 'E8559831c' to different enumeration type 'enum E8559831a'}}
404 test_8559831_a(value_d
);
405 enum E8559831a a3
= value_d
;
409 void test26(int si
, long sl
) {
410 si
= sl
% sl
; // expected-warning {{implicit conversion loses integer precision: 'long' to 'int'}}
414 si
= sl
/ si
; // expected-warning {{implicit conversion loses integer precision: 'long' to 'int'}}
417 typedef unsigned short uint16_t;
418 typedef unsigned int uint32_t;
419 typedef __attribute__ ((ext_vector_type(16),__aligned__(32))) uint16_t ushort16
;
420 typedef __attribute__ ((ext_vector_type( 8),__aligned__( 32))) uint32_t uint8
;
422 void test27(ushort16 constants
) {
423 uint8 pairedConstants
= (uint8
) constants
;
424 ushort16 crCbScale
= pairedConstants
.s4
; // expected-warning {{implicit conversion loses integer precision: 'uint32_t' (aka 'unsigned int') to 'ushort16'}}
425 ushort16 brBias
= pairedConstants
.s6
; // expected-warning {{implicit conversion loses integer precision: 'uint32_t' (aka 'unsigned int') to 'ushort16'}}
429 float double2float_test1(double a
) {
430 return a
; // expected-warning {{implicit conversion loses floating-point precision: 'double' to 'float'}}
433 void double2float_test2(double a
, float *b
) {
434 *b
+= a
; // expected-warning {{implicit conversion when assigning computation result loses floating-point precision: 'double' to 'float'}}
437 float sinf (float x
);
438 double double2float_test3(double a
) {
439 return sinf(a
); // expected-warning {{implicit conversion loses floating-point precision: 'double' to 'float'}}
442 float double2float_test4(double a
, float b
) {
443 b
-= a
; // expected-warning {{implicit conversion when assigning computation result loses floating-point precision: 'double' to 'float'}}