[PATCH] D70425: [APFloat] Fix construction of APFloat with FP value instead of integer
Ehud Katz via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 19 02:54:50 PST 2019
ekatz created this revision.
ekatz added reviewers: scanon, chandlerc, arsenm, efriedma.
ekatz added a project: LLVM.
Herald added subscribers: llvm-commits, dexonsmith, wdng.
Constructor invocations such as `APFloat(APFloat::IEEEdouble(), 0.0)` have a float literal (only `0.0`, `1.0` and `3.0` in all the unit tests) in the source 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'. The tests just happen to pass, as the FP values used are all without fraction.
Fix PR34095.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D70425
Files:
llvm/unittests/ADT/APFloatTest.cpp
Index: llvm/unittests/ADT/APFloatTest.cpp
===================================================================
--- llvm/unittests/ADT/APFloatTest.cpp
+++ llvm/unittests/ADT/APFloatTest.cpp
@@ -520,9 +520,9 @@
// 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);
@@ -591,9 +591,9 @@
{
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());
@@ -603,9 +603,9 @@
{
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());
@@ -615,9 +615,9 @@
{
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());
@@ -627,9 +627,9 @@
{
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());
@@ -1144,8 +1144,8 @@
#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) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D70425.230018.patch
Type: text/x-patch
Size: 3364 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191119/4463eae7/attachment.bin>
More information about the llvm-commits
mailing list