summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Ballman <aaron@aaronballman.com>2015-12-30 14:26:07 +0000
committerAaron Ballman <aaron@aaronballman.com>2015-12-30 14:26:07 +0000
commitdbc441eb34d41e929f4d07b16e030746f25fd344 (patch)
treefc48e3065ad63f27dff1e5c63f2537afbb08bdc0
parent666761afabe5c7a36c4b326d537d00c2820644f2 (diff)
downloadbcm5719-llvm-dbc441eb34d41e929f4d07b16e030746f25fd344.tar.gz
bcm5719-llvm-dbc441eb34d41e929f4d07b16e030746f25fd344.zip
When performing an implicit from float to bool, the floating point value must be *exactly* zero in order for the conversion to result in 0. This does not involve a conversion through an integer value, and so truncation of the value is not performed.
This patch address PR25876. llvm-svn: 256643
-rw-r--r--clang/lib/Sema/SemaChecking.cpp2
-rw-r--r--clang/test/SemaCXX/warn-literal-conversion.cpp11
2 files changed, 12 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 59d51f7e84c..cbdcb5e4839 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -6983,7 +6983,7 @@ void DiagnoseFloatingLiteralImpCast(Sema &S, FloatingLiteral *FL, QualType T,
SmallString<16> PrettyTargetValue;
if (T->isSpecificBuiltinType(BuiltinType::Bool))
- PrettyTargetValue = IntegerValue == 0 ? "false" : "true";
+ PrettyTargetValue = Value.isZero() ? "false" : "true";
else
IntegerValue.toString(PrettyTargetValue);
diff --git a/clang/test/SemaCXX/warn-literal-conversion.cpp b/clang/test/SemaCXX/warn-literal-conversion.cpp
index d7bec4c73e5..5d4b6f7f5bf 100644
--- a/clang/test/SemaCXX/warn-literal-conversion.cpp
+++ b/clang/test/SemaCXX/warn-literal-conversion.cpp
@@ -38,3 +38,14 @@ void test0() {
int y = (24*60*60) * 0.25;
int pennies = 123.45 * 100;
}
+
+// Similarly, test floating point conversion to bool. Only float values of zero
+// are converted to false; everything else is converted to true.
+void test1() {
+ bool b1 = 0.99f; // expected-warning {{implicit conversion from 'float' to 'bool' changes value from 0.99 to true}}
+ bool b2 = 0.99; // expected-warning {{implicit conversion from 'double' to 'bool' changes value from 0.99 to true}}
+ // These do not warn because they can be directly converted to integral
+ // values.
+ bool b3 = 0.0f;
+ bool b4 = 0.0;
+}
OpenPOWER on IntegriCloud