diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/Sema/conversion.c | 10 | ||||
-rw-r--r-- | clang/test/Sema/ext_vector_casts.c | 10 | ||||
-rw-r--r-- | clang/test/Sema/implicit-int-float-conversion.c | 53 | ||||
-rw-r--r-- | clang/test/Sema/implicit-int-float-narrowing.cpp | 10 |
4 files changed, 73 insertions, 10 deletions
diff --git a/clang/test/Sema/conversion.c b/clang/test/Sema/conversion.c index 07b22a8a648..ba4adbdad22 100644 --- a/clang/test/Sema/conversion.c +++ b/clang/test/Sema/conversion.c @@ -233,7 +233,7 @@ void test8(int v) { takes_int(v); takes_long(v); takes_longlong(v); - takes_float(v); + takes_float(v); // expected-warning {{implicit conversion from 'int' to 'float' may lose precision}} takes_double(v); takes_longdouble(v); } @@ -244,8 +244,8 @@ void test9(long v) { takes_int(v); // expected-warning {{implicit conversion loses integer precision}} takes_long(v); takes_longlong(v); - takes_float(v); - takes_double(v); + takes_float(v); // expected-warning {{implicit conversion from 'long' to 'float' may lose precision}} + takes_double(v); // expected-warning {{implicit conversion from 'long' to 'double' may lose precision}} takes_longdouble(v); } @@ -255,8 +255,8 @@ void test10(long long v) { takes_int(v); // expected-warning {{implicit conversion loses integer precision}} takes_long(v); takes_longlong(v); - takes_float(v); - takes_double(v); + takes_float(v); // expected-warning {{implicit conversion from 'long long' to 'float' may lose precision}} + takes_double(v); // expected-warning {{implicit conversion from 'long long' to 'double' may lose precision}} takes_longdouble(v); } diff --git a/clang/test/Sema/ext_vector_casts.c b/clang/test/Sema/ext_vector_casts.c index 6aaedbe7fd1..b13f8368348 100644 --- a/clang/test/Sema/ext_vector_casts.c +++ b/clang/test/Sema/ext_vector_casts.c @@ -115,12 +115,12 @@ static void splats(int i, long l, __uint128_t t, float f, double d) { vl = vl + t; // expected-warning {{implicit conversion loses integer precision}} vf = 1 + vf; - vf = l + vf; + vf = l + vf; // expected-warning {{implicit conversion from 'long' to 'float2' (vector of 2 'float' values) may lose precision}} vf = 2.0 + vf; vf = d + vf; // expected-warning {{implicit conversion loses floating-point precision}} - vf = vf + 0xffffffff; + vf = vf + 0xffffffff; // expected-warning {{implicit conversion from 'unsigned int' to 'float2' (vector of 2 'float' values) changes value from 4294967295 to 4294967296}} vf = vf + 2.1; // expected-warning {{implicit conversion loses floating-point precision}} - - vd = l + vd; - vd = vd + t; + + vd = l + vd; // expected-warning {{implicit conversion from 'long' to 'double2' (vector of 2 'double' values) may lose precision}} + vd = vd + t; // expected-warning {{implicit conversion from '__uint128_t' (aka 'unsigned __int128') to 'double2' (vector of 2 'double' values) may lose precision}} } diff --git a/clang/test/Sema/implicit-int-float-conversion.c b/clang/test/Sema/implicit-int-float-conversion.c new file mode 100644 index 00000000000..0933cd93516 --- /dev/null +++ b/clang/test/Sema/implicit-int-float-conversion.c @@ -0,0 +1,53 @@ +// RUN: %clang_cc1 %s -verify -Wno-conversion -Wimplicit-int-float-conversion + +long testReturn(long a, float b) { + return a + b; // expected-warning {{implicit conversion from 'long' to 'float' may lose precision}} +} + +void testAssignment() { + float f = 222222; + double b = 222222222222L; + +#ifndef __ILP32__ + float ff = 222222222222L; // expected-warning {{implicit conversion from 'long' to 'float' changes value from 222222222222 to 222222221312}} + float ffff = 222222222222UL; // expected-warning {{implicit conversion from 'unsigned long' to 'float' changes value from 222222222222 to 222222221312}} +#else + float ff = 222222222222L; // expected-warning {{implicit conversion from 'long long' to 'float' changes value from 222222222222 to 222222221312}} + float ffff = 222222222222UL; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 222222222222 to 222222221312}} +#endif + + long l = 222222222222L; + float fff = l; // expected-warning {{implicit conversion from 'long' to 'float' may lose precision}} +} + +void testExpression() { + float a = 0.0f; + +#ifndef __ILP32__ + float b = 222222222222L + a; // expected-warning {{implicit conversion from 'long' to 'float' changes value from 222222222222 to 222222221312}} +#else + float b = 222222222222L + a; // expected-warning {{implicit conversion from 'long long' to 'float' changes value from 222222222222 to 222222221312}} +#endif + + float g = 22222222 + 22222222; + float c = 22222222 + 22222223; // expected-warning {{implicit conversion from 'int' to 'float' changes value from 44444445 to 44444444}} + + int i = 0; + float d = i + a; // expected-warning {{implicit conversion from 'int' to 'float' may lose precision}} + + double e = 0.0; + double f = i + e; +} + +void testCNarrowing() { + // Since this is a C file. C++11 narrowing is not in effect. + // In this case, we should issue warnings. +#ifndef __ILP32__ + float a = {222222222222L}; // expected-warning {{implicit conversion from 'long' to 'float' changes value from 222222222222 to 222222221312}} +#else + float a = {222222222222L}; // expected-warning {{implicit conversion from 'long long' to 'float' changes value from 222222222222 to 222222221312}} +#endif + + long b = 222222222222L; + float c = {b}; // expected-warning {{implicit conversion from 'long' to 'float' may lose precision}} +} diff --git a/clang/test/Sema/implicit-int-float-narrowing.cpp b/clang/test/Sema/implicit-int-float-narrowing.cpp new file mode 100644 index 00000000000..6de637e78c5 --- /dev/null +++ b/clang/test/Sema/implicit-int-float-narrowing.cpp @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 %s -verify -Wno-conversion -Wno-c++11-narrowing -Wimplicit-int-float-conversion + +void testNoWarningOnNarrowing() { + // Test that we do not issue duplicated warnings for + // C++11 narrowing. + float a = {222222222222L}; // expected-no-diagnostics + + long b = 222222222222L; + float c = {b}; // expected-no-diagnostics +} |