diff options
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/Sema/conversion.c | 226 | 
1 files changed, 226 insertions, 0 deletions
| diff --git a/clang/test/Sema/conversion.c b/clang/test/Sema/conversion.c new file mode 100644 index 00000000000..f19d97ec5e6 --- /dev/null +++ b/clang/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); +} | 

