summaryrefslogtreecommitdiffstats
path: root/clang/test/Sema/implicit-int-float-conversion.c
diff options
context:
space:
mode:
authorZiang Wan <ziangw2@illinois.edu>2019-08-01 00:16:43 +0000
committerZiang Wan <ziangw2@illinois.edu>2019-08-01 00:16:43 +0000
commit87b668befe19d47dd14919b2f322a81f1478e49d (patch)
treef9931482012c959d866e42a7972bd23b7e7be852 /clang/test/Sema/implicit-int-float-conversion.c
parent153f20057c2f17d48c4feb08514811e61a86d0a8 (diff)
downloadbcm5719-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.c53
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}}
+}
OpenPOWER on IntegriCloud