summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/ADT/APFloatTest.cpp
diff options
context:
space:
mode:
authorEhud Katz <ehudkatz@gmail.com>2019-12-04 11:57:38 +0200
committerEhud Katz <ehudkatz@gmail.com>2019-12-04 12:02:04 +0200
commit2b6b8cb10c870d64f7cc29d21fc27cef3c7e0056 (patch)
tree1b70dcf6b8d367eb44137170e94107a0b6d9f910 /llvm/unittests/ADT/APFloatTest.cpp
parent1351672eedbf9716def4fc789d9046c481c7cd25 (diff)
downloadbcm5719-llvm-2b6b8cb10c870d64f7cc29d21fc27cef3c7e0056.tar.gz
bcm5719-llvm-2b6b8cb10c870d64f7cc29d21fc27cef3c7e0056.zip
[APFloat] Prevent construction of APFloat with Semantics and FP value
Constructor invocations such as `APFloat(APFloat::IEEEdouble(), 0.0)` may seem like they accept a FP (floating point) value, but the overload they reach is actually the `integerPart` one, not a `float` or `double` overload (which only exists when `fltSemantics` isn't passed). This may lead to possible loss of data, by the conversion from `float` or `double` to `integerPart`. To prevent future mistakes, a new constructor overload, which accepts any FP value and marked with `delete`, to prevent its usage. Fixes PR34095. Differential Revision: https://reviews.llvm.org/D70425
Diffstat (limited to 'llvm/unittests/ADT/APFloatTest.cpp')
-rw-r--r--llvm/unittests/ADT/APFloatTest.cpp26
1 files changed, 13 insertions, 13 deletions
diff --git a/llvm/unittests/ADT/APFloatTest.cpp b/llvm/unittests/ADT/APFloatTest.cpp
index 656945b325e..518b207e23e 100644
--- a/llvm/unittests/ADT/APFloatTest.cpp
+++ b/llvm/unittests/ADT/APFloatTest.cpp
@@ -520,9 +520,9 @@ TEST(APFloatTest, FMA) {
// Test x87 extended precision case from http://llvm.org/PR20728.
{
- APFloat M1(APFloat::x87DoubleExtended(), 1.0);
- APFloat M2(APFloat::x87DoubleExtended(), 1.0);
- APFloat A(APFloat::x87DoubleExtended(), 3.0);
+ APFloat M1(APFloat::x87DoubleExtended(), 1);
+ APFloat M2(APFloat::x87DoubleExtended(), 1);
+ APFloat A(APFloat::x87DoubleExtended(), 3);
bool losesInfo = false;
M1.fusedMultiplyAdd(M1, A, APFloat::rmNearestTiesToEven);
@@ -600,9 +600,9 @@ TEST(APFloatTest, Denormal) {
{
const char *MinNormalStr = "1.17549435082228750797e-38";
EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), MinNormalStr).isDenormal());
- EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), 0.0).isDenormal());
+ EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), 0).isDenormal());
- APFloat Val2(APFloat::IEEEsingle(), 2.0e0);
+ APFloat Val2(APFloat::IEEEsingle(), 2);
APFloat T(APFloat::IEEEsingle(), MinNormalStr);
T.divide(Val2, rdmd);
EXPECT_TRUE(T.isDenormal());
@@ -612,9 +612,9 @@ TEST(APFloatTest, Denormal) {
{
const char *MinNormalStr = "2.22507385850720138309e-308";
EXPECT_FALSE(APFloat(APFloat::IEEEdouble(), MinNormalStr).isDenormal());
- EXPECT_FALSE(APFloat(APFloat::IEEEdouble(), 0.0).isDenormal());
+ EXPECT_FALSE(APFloat(APFloat::IEEEdouble(), 0).isDenormal());
- APFloat Val2(APFloat::IEEEdouble(), 2.0e0);
+ APFloat Val2(APFloat::IEEEdouble(), 2);
APFloat T(APFloat::IEEEdouble(), MinNormalStr);
T.divide(Val2, rdmd);
EXPECT_TRUE(T.isDenormal());
@@ -624,9 +624,9 @@ TEST(APFloatTest, Denormal) {
{
const char *MinNormalStr = "3.36210314311209350626e-4932";
EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended(), MinNormalStr).isDenormal());
- EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended(), 0.0).isDenormal());
+ EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended(), 0).isDenormal());
- APFloat Val2(APFloat::x87DoubleExtended(), 2.0e0);
+ APFloat Val2(APFloat::x87DoubleExtended(), 2);
APFloat T(APFloat::x87DoubleExtended(), MinNormalStr);
T.divide(Val2, rdmd);
EXPECT_TRUE(T.isDenormal());
@@ -636,9 +636,9 @@ TEST(APFloatTest, Denormal) {
{
const char *MinNormalStr = "3.36210314311209350626267781732175260e-4932";
EXPECT_FALSE(APFloat(APFloat::IEEEquad(), MinNormalStr).isDenormal());
- EXPECT_FALSE(APFloat(APFloat::IEEEquad(), 0.0).isDenormal());
+ EXPECT_FALSE(APFloat(APFloat::IEEEquad(), 0).isDenormal());
- APFloat Val2(APFloat::IEEEquad(), 2.0e0);
+ APFloat Val2(APFloat::IEEEquad(), 2);
APFloat T(APFloat::IEEEquad(), MinNormalStr);
T.divide(Val2, rdmd);
EXPECT_TRUE(T.isDenormal());
@@ -1153,8 +1153,8 @@ TEST(APFloatTest, makeNaN) {
#ifdef GTEST_HAS_DEATH_TEST
#ifndef NDEBUG
TEST(APFloatTest, SemanticsDeath) {
- EXPECT_DEATH(APFloat(APFloat::IEEEsingle(), 0.0f).convertToDouble(), "Float semantics are not IEEEdouble");
- EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), 0.0 ).convertToFloat(), "Float semantics are not IEEEsingle");
+ EXPECT_DEATH(APFloat(APFloat::IEEEsingle(), 0).convertToDouble(), "Float semantics are not IEEEdouble");
+ EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), 0).convertToFloat(), "Float semantics are not IEEEsingle");
}
TEST(APFloatTest, StringDecimalDeath) {
OpenPOWER on IntegriCloud