diff options
| author | Ziang Wan <ziangw2@illinois.edu> | 2019-08-01 00:16:43 +0000 |
|---|---|---|
| committer | Ziang Wan <ziangw2@illinois.edu> | 2019-08-01 00:16:43 +0000 |
| commit | 87b668befe19d47dd14919b2f322a81f1478e49d (patch) | |
| tree | f9931482012c959d866e42a7972bd23b7e7be852 /clang/test/Sema/implicit-int-float-conversion.c | |
| parent | 153f20057c2f17d48c4feb08514811e61a86d0a8 (diff) | |
| download | bcm5719-llvm-87b668befe19d47dd14919b2f322a81f1478e49d.tar.gz bcm5719-llvm-87b668befe19d47dd14919b2f322a81f1478e49d.zip | |
[Sema] Enable -Wimplicit-float-conversion for integral to floating point precision loss
Issue an warning when the code tries to do an implicit int -> float
conversion, where the float type ha a narrower significant than the
float type.
The new warning is controlled by flag -Wimplicit-int-float-conversion,
under -Wimplicit-float-conversion and -Wconversion. It is also silenced
when c++11 narrowing warning is issued.
Differential Revision: https://reviews.llvm.org/D64666
llvm-svn: 367497
Diffstat (limited to 'clang/test/Sema/implicit-int-float-conversion.c')
| -rw-r--r-- | clang/test/Sema/implicit-int-float-conversion.c | 53 |
1 files changed, 53 insertions, 0 deletions
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}} +} |

