From: John McCall Date: Sat, 7 Nov 2009 03:30:38 +0000 (+0000) Subject: Test case for -Wconversion. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d5c376e4a034233a8efee81404041e33d8f0df5a;p=clang Test case for -Wconversion. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86327 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Sema/conversion.c b/test/Sema/conversion.c new file mode 100644 index 0000000000..f19d97ec5e --- /dev/null +++ b/test/Sema/conversion.c @@ -0,0 +1,226 @@ +// RUN: clang-cc -fsyntax-only -verify -Wconversion -triple x86_64-apple-darwin %s + +#define BIG 0x7f7f7f7f7f7f7f7fL + +void test0(char c, short s, int i, long l, long long ll) { + c = c; + c = s; // expected-warning {{implicit cast loses integer precision}} + c = i; // expected-warning {{implicit cast loses integer precision}} + c = l; // expected-warning {{implicit cast loses integer precision}} + s = c; + s = s; + s = i; // expected-warning {{implicit cast loses integer precision}} + s = l; // expected-warning {{implicit cast loses integer precision}} + i = c; + i = s; + i = i; + i = l; // expected-warning {{implicit cast loses integer precision}} + l = c; + l = s; + l = i; + l = l; + + c = (char) 0; + c = (short) 0; + c = (int) 0; + c = (long) 0; + s = (char) 0; + s = (short) 0; + s = (int) 0; + s = (long) 0; + i = (char) 0; + i = (short) 0; + i = (int) 0; + i = (long) 0; + l = (char) 0; + l = (short) 0; + l = (int) 0; + l = (long) 0; + + c = (char) BIG; + c = (short) BIG; // expected-warning {{implicit cast loses integer precision}} + c = (int) BIG; // expected-warning {{implicit cast loses integer precision}} + c = (long) BIG; // expected-warning {{implicit cast loses integer precision}} + s = (char) BIG; + s = (short) BIG; + s = (int) BIG; // expected-warning {{implicit cast loses integer precision}} + s = (long) BIG; // expected-warning {{implicit cast loses integer precision}} + i = (char) BIG; + i = (short) BIG; + i = (int) BIG; + i = (long) BIG; // expected-warning {{implicit cast loses integer precision}} + l = (char) BIG; + l = (short) BIG; + l = (int) BIG; + l = (long) BIG; +} + +char test1(long long ll) { + return (long long) ll; // expected-warning {{implicit cast loses integer precision}} + return (long) ll; // expected-warning {{implicit cast loses integer precision}} + return (int) ll; // expected-warning {{implicit cast loses integer precision}} + return (short) ll; // expected-warning {{implicit cast loses integer precision}} + return (char) ll; + return (long long) BIG; // expected-warning {{implicit cast loses integer precision}} + return (long) BIG; // expected-warning {{implicit cast loses integer precision}} + return (int) BIG; // expected-warning {{implicit cast loses integer precision}} + return (short) BIG; // expected-warning {{implicit cast loses integer precision}} + return (char) BIG; +} + +short test2(long long ll) { + return (long long) ll; // expected-warning {{implicit cast loses integer precision}} + return (long) ll; // expected-warning {{implicit cast loses integer precision}} + return (int) ll; // expected-warning {{implicit cast loses integer precision}} + return (short) ll; + return (char) ll; + return (long long) BIG; // expected-warning {{implicit cast loses integer precision}} + return (long) BIG; // expected-warning {{implicit cast loses integer precision}} + return (int) BIG; // expected-warning {{implicit cast loses integer precision}} + return (short) BIG; + return (char) BIG; +} + +int test3(long long ll) { + return (long long) ll; // expected-warning {{implicit cast loses integer precision}} + return (long) ll; // expected-warning {{implicit cast loses integer precision}} + return (int) ll; + return (short) ll; + return (char) ll; + return (long long) BIG; // expected-warning {{implicit cast loses integer precision}} + return (long) BIG; // expected-warning {{implicit cast loses integer precision}} + return (int) BIG; + return (short) BIG; + return (char) BIG; +} + +long test4(long long ll) { + return (long long) ll; + return (long) ll; + return (int) ll; + return (short) ll; + return (char) ll; + return (long long) BIG; + return (long) BIG; + return (int) BIG; + return (short) BIG; + return (char) BIG; +} + +long long test5(long long ll) { + return (long long) ll; + return (long) ll; + return (int) ll; + return (short) ll; + return (char) ll; + return (long long) BIG; + return (long) BIG; + return (int) BIG; + return (short) BIG; + return (char) BIG; +} + +void takes_char(char); +void takes_short(short); +void takes_int(int); +void takes_long(long); +void takes_longlong(long long); +void takes_float(float); +void takes_double(double); +void takes_longdouble(long double); + +void test6(char v) { + takes_char(v); + takes_short(v); + takes_int(v); + takes_long(v); + takes_longlong(v); + takes_float(v); + takes_double(v); + takes_longdouble(v); +} + +void test7(short v) { + takes_char(v); // expected-warning {{implicit cast loses integer precision}} + takes_short(v); + takes_int(v); + takes_long(v); + takes_longlong(v); + takes_float(v); + takes_double(v); + takes_longdouble(v); +} + +void test8(int v) { + takes_char(v); // expected-warning {{implicit cast loses integer precision}} + takes_short(v); // expected-warning {{implicit cast loses integer precision}} + takes_int(v); + takes_long(v); + takes_longlong(v); + takes_float(v); + takes_double(v); + takes_longdouble(v); +} + +void test9(long v) { + takes_char(v); // expected-warning {{implicit cast loses integer precision}} + takes_short(v); // expected-warning {{implicit cast loses integer precision}} + takes_int(v); // expected-warning {{implicit cast loses integer precision}} + takes_long(v); + takes_longlong(v); + takes_float(v); + takes_double(v); + takes_longdouble(v); +} + +void test10(long long v) { + takes_char(v); // expected-warning {{implicit cast loses integer precision}} + takes_short(v); // expected-warning {{implicit cast loses integer precision}} + takes_int(v); // expected-warning {{implicit cast loses integer precision}} + takes_long(v); + takes_longlong(v); + takes_float(v); + takes_double(v); + takes_longdouble(v); +} + +void test11(float v) { + takes_char(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_short(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_int(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_long(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_longlong(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_float(v); + takes_double(v); + takes_longdouble(v); +} + +void test12(double v) { + takes_char(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_short(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_int(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_long(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_longlong(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_float(v); // expected-warning {{implicit cast loses floating-point precision}} + takes_double(v); + takes_longdouble(v); +} + +void test13(long double v) { + takes_char(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_short(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_int(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_long(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_longlong(v); // expected-warning {{implicit cast turns floating-point number into integer}} + takes_float(v); // expected-warning {{implicit cast loses floating-point precision}} + takes_double(v); // expected-warning {{implicit cast loses floating-point precision}} + takes_longdouble(v); +} + +void test14(long l) { + // Fine because of the boolean whitelist. + char c; + c = (l == 4); + c = ((l <= 4) && (l >= 0)); + c = ((l <= 4) && (l >= 0)) || (l > 20); +}