446 lines · c
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-code4 5#include <conversion.h>6 7#define BIG 0x7f7f7f7f7f7f7f7fL8 9void test0(char c, short s, int i, long l, long long ll) {10 c = c;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}}14 s = c;15 s = s;16 s = i; // expected-warning {{implicit conversion loses integer precision}}17 s = l; // expected-warning {{implicit conversion loses integer precision}}18 i = c;19 i = s;20 i = i;21 i = l; // expected-warning {{implicit conversion loses integer precision}}22 l = c;23 l = s;24 l = i;25 l = l;26 27 c = (char) 0;28 c = (short) 0;29 c = (int) 0;30 c = (long) 0;31 s = (char) 0;32 s = (short) 0;33 s = (int) 0;34 s = (long) 0;35 i = (char) 0;36 i = (short) 0;37 i = (int) 0;38 i = (long) 0;39 l = (char) 0;40 l = (short) 0;41 l = (int) 0;42 l = (long) 0;43 44 c = (char) BIG;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}}48 s = (char) BIG;49 s = (short) BIG;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}}52 i = (char) BIG;53 i = (short) BIG;54 i = (int) BIG;55 i = (long) BIG; // expected-warning {{implicit conversion from 'long' to 'int' changes value}}56 l = (char) BIG;57 l = (short) BIG;58 l = (int) BIG;59 l = (long) BIG;60}61 62char test1(long long ll) {63 return (long long) ll; // expected-warning {{implicit conversion loses integer precision}}64}65char test1_a(long long ll) {66 return (long) ll; // expected-warning {{implicit conversion loses integer precision}}67}68char test1_b(long long ll) {69 return (int) ll; // expected-warning {{implicit conversion loses integer precision}}70}71char test1_c(long long ll) {72 return (short) ll; // expected-warning {{implicit conversion loses integer precision}}73}74char test1_d(long long ll) {75 return (char) ll;76}77char test1_e(long long ll) {78 return (long long) BIG; // expected-warning {{implicit conversion from 'long long' to 'char' changes value}}79}80char test1_f(long long ll) {81 return (long) BIG; // expected-warning {{implicit conversion from 'long' to 'char' changes value}}82}83char test1_g(long long ll) {84 return (int) BIG; // expected-warning {{implicit conversion from 'int' to 'char' changes value}}85}86char test1_h(long long ll) {87 return (short) BIG; // expected-warning {{implicit conversion from 'short' to 'char' changes value}}88}89char test1_i(long long ll) {90 return (char) BIG;91}92 93short test2(long long ll) {94 return (long long) ll; // expected-warning {{implicit conversion loses integer precision}}95}96short test2_a(long long ll) {97 return (long) ll; // expected-warning {{implicit conversion loses integer precision}}98}99short test2_b(long long ll) {100 return (int) ll; // expected-warning {{implicit conversion loses integer precision}}101}102short test2_c(long long ll) {103 return (short) ll;104}105short test2_d(long long ll) {106 return (char) ll;107}108short test2_e(long long ll) {109 return (long long) BIG; // expected-warning {{implicit conversion from 'long long' to 'short' changes value}}110}111short test2_f(long long ll) {112 return (long) BIG; // expected-warning {{implicit conversion from 'long' to 'short' changes value}}113}114short test2_g(long long ll) {115 return (int) BIG; // expected-warning {{implicit conversion from 'int' to 'short' changes value}}116}117short test2_h(long long ll) {118 return (short) BIG;119}120short test2_i(long long ll) {121 return (char) BIG;122}123 124int test3(long long ll) {125 return (long long) ll; // expected-warning {{implicit conversion loses integer precision}}126}127int test3_b(long long ll) {128 return (long) ll; // expected-warning {{implicit conversion loses integer precision}}129}130int test3_c(long long ll) {131 return (int) ll;132}133int test3_d(long long ll) {134 return (short) ll;135}136int test3_e(long long ll) {137 return (char) ll;138}139int test3_f(long long ll) {140 return (long long) BIG; // expected-warning {{implicit conversion from 'long long' to 'int' changes value}}141}142int test3_g(long long ll) {143 return (long) BIG; // expected-warning {{implicit conversion from 'long' to 'int' changes value}}144}145int test3_h(long long ll) {146 return (int) BIG;147}148int test3_i(long long ll) {149 return (short) BIG;150}151int test3_j(long long ll) {152 return (char) BIG;153}154 155long test4(long long ll) {156 return (long long) ll;157}158long test4_a(long long ll) {159 return (long) ll;160}161long test4_b(long long ll) {162 return (int) ll;163}164long test4_c(long long ll) {165 return (short) ll;166}167long test4_d(long long ll) {168 return (char) ll;169}170long test4_e(long long ll) {171 return (long long) BIG;172}173long test4_f(long long ll) {174 return (long) BIG;175}176long test4_g(long long ll) {177 return (int) BIG;178}179long test4_h(long long ll) {180 return (short) BIG;181}182long test4_i(long long ll) {183 return (char) BIG;184}185 186long long test5(long long ll) {187 return (long long) ll;188 return (long) ll;189 return (int) ll;190 return (short) ll;191 return (char) ll;192 return (long long) BIG;193 return (long) BIG;194 return (int) BIG;195 return (short) BIG;196 return (char) BIG;197}198 199void takes_char(char);200void takes_short(short);201void takes_int(int);202void takes_long(long);203void takes_longlong(long long);204void takes_float(float);205void takes_double(double);206void takes_longdouble(long double);207 208void test6(char v) {209 takes_char(v);210 takes_short(v);211 takes_int(v);212 takes_long(v);213 takes_longlong(v);214 takes_float(v);215 takes_double(v);216 takes_longdouble(v);217}218 219void test7(short v) {220 takes_char(v); // expected-warning {{implicit conversion loses integer precision}}221 takes_short(v);222 takes_int(v);223 takes_long(v);224 takes_longlong(v);225 takes_float(v);226 takes_double(v);227 takes_longdouble(v);228}229 230void test8(int v) {231 takes_char(v); // expected-warning {{implicit conversion loses integer precision}}232 takes_short(v); // expected-warning {{implicit conversion loses integer precision}}233 takes_int(v);234 takes_long(v);235 takes_longlong(v);236 takes_float(v); // expected-warning {{implicit conversion from 'int' to 'float' may lose precision}}237 takes_double(v);238 takes_longdouble(v);239}240 241void test9(long v) {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}}245 takes_long(v);246 takes_longlong(v);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}}249 takes_longdouble(v);250}251 252void 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}}256 takes_long(v);257 takes_longlong(v);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}}260 takes_longdouble(v);261}262 263void 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}}269 takes_float(v);270 takes_double(v);271 takes_longdouble(v);272}273 274void 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}}281 takes_double(v);282 takes_longdouble(v);283}284 285void 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}}293 takes_longdouble(v);294}295 296void test14(long l) {297 // Fine because of the boolean allowlist.298 char c;299 c = (l == 4);300 c = ((l <= 4) && (l >= 0));301 c = ((l <= 4) && (l >= 0)) || (l > 20);302}303 304void test15(char c) {305 c = c + 1 + c * 2;306 c = (short) c + 1 + c * 2; // expected-warning {{implicit conversion loses integer precision}}307}308 309// PR 5422310extern void *test16_external;311void test16(void) {312 int a = (unsigned long) &test16_external; // expected-warning {{implicit conversion loses integer precision}}313}314 315// PR 5938316void test17(void) {317 union {318 unsigned long long a : 8;319 unsigned long long b : 32;320 unsigned long long c;321 } U;322 323 unsigned int x;324 x = U.a;325 x = U.b;326 x = U.c; // expected-warning {{implicit conversion loses integer precision}} 327}328 329// PR 5939330void test18(void) {331 union {332 unsigned long long a : 1;333 unsigned long long b;334 } U;335 336 int x;337 x = (U.a ? 0 : 1);338 x = (U.b ? 0 : 1);339}340 341// None of these should warn.342unsigned char test19(unsigned long u64) {343 unsigned char x1 = u64 & 0xff;344 unsigned char x2 = u64 >> 56;345 346 unsigned char mask = 0xee;347 unsigned char x3 = u64 & mask;348 return x1 + x2 + x3;349}350 351void test_7631400(void) {352 // This should show up despite the caret being inside a macro substitution353 char s = LONG_MAX; // expected-warning {{implicit conversion from 'long' to 'char' changes value}}354}355 356// assertion for compound operators with non-integral RHS357void f7676608(int);358void test_7676608(void) {359 float q = 0.7f;360 char c = 5;361 f7676608(c *= q); // expected-warning {{conversion}}362}363 364void test_7904686(void) {365 const int i = -1;366 unsigned u1 = i; // expected-warning {{implicit conversion changes signedness}} 367 u1 = i; // expected-warning {{implicit conversion changes signedness}} 368 369 unsigned u2 = -1; // expected-warning {{implicit conversion changes signedness}} 370 u2 = -1; // expected-warning {{implicit conversion changes signedness}} 371}372 373// don't warn about conversions required by contexts in system headers374void test_8232669(void) {375 unsigned bitset[20];376 SETBIT(bitset, 0);377 378 unsigned y = 50;379 SETBIT(bitset, y);380 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}}383}384 385enum E8559831a { E8559831a_val };386enum E8559831b { E8559831b_val };387typedef enum { E8559831c_val } E8559831c;388enum { E8559831d_val } value_d;389 390void test_8559831_a(enum E8559831a value);391void 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'}}395 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'}}399 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'}}403 404 test_8559831_a(value_d);405 enum E8559831a a3 = value_d;406 a3 = value_d;407}408 409void test26(int si, long sl) {410 si = sl % sl; // expected-warning {{implicit conversion loses integer precision: 'long' to 'int'}}411 si = sl % si;412 si = si % sl;413 si = si / sl;414 si = sl / si; // expected-warning {{implicit conversion loses integer precision: 'long' to 'int'}}415}416 417typedef unsigned short uint16_t;418typedef unsigned int uint32_t;419typedef __attribute__ ((ext_vector_type(16),__aligned__(32))) uint16_t ushort16;420typedef __attribute__ ((ext_vector_type( 8),__aligned__( 32))) uint32_t uint8;421 422void 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'}}426}427 428 429float double2float_test1(double a) {430 return a; // expected-warning {{implicit conversion loses floating-point precision: 'double' to 'float'}}431}432 433void double2float_test2(double a, float *b) {434 *b += a; // expected-warning {{implicit conversion when assigning computation result loses floating-point precision: 'double' to 'float'}}435}436 437float sinf (float x);438double double2float_test3(double a) {439 return sinf(a); // expected-warning {{implicit conversion loses floating-point precision: 'double' to 'float'}}440}441 442float double2float_test4(double a, float b) {443 b -= a; // expected-warning {{implicit conversion when assigning computation result loses floating-point precision: 'double' to 'float'}}444 return b;445}446