diff options
author | Serguei Katkov <serguei.katkov@azul.com> | 2017-10-19 11:16:03 +0000 |
---|---|---|
committer | Serguei Katkov <serguei.katkov@azul.com> | 2017-10-19 11:16:03 +0000 |
commit | 4f7d5ef2260f20f9773810b05eb085d97ddfc7c1 (patch) | |
tree | 21be2bbc08addbefcae9d6610b7cc6de73a4c15a | |
parent | 7bf71008aa69e035832d610d6a658f8f09e1f97d (diff) | |
download | bcm5719-llvm-4f7d5ef2260f20f9773810b05eb085d97ddfc7c1.tar.gz bcm5719-llvm-4f7d5ef2260f20f9773810b05eb085d97ddfc7c1.zip |
Fix APFloat from string conversion for Inf
The method IEEEFloat::convertFromStringSpecials() does not recognize
the "+Inf" and "-Inf" strings but these strings are printed for
the double Infinities by the IEEEFloat::toString().
This patch adds the "+Inf" and "-Inf" strings to the list of recognized
patterns in IEEEFloat::convertFromStringSpecials().
Reviewers: sberg, bogner, majnemer, timshen, rnk, skatkov, gottesmm, bkramer, scanon
Reviewed By: skatkov
Subscribers: apilipenko, reames, llvm-commits
Differential Revision: https://reviews.llvm.org/D38030
llvm-svn: 316156
-rw-r--r-- | llvm/lib/Support/APFloat.cpp | 4 | ||||
-rw-r--r-- | llvm/unittests/ADT/APFloatTest.cpp | 16 |
2 files changed, 18 insertions, 2 deletions
diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp index f835bd1fbd2..cc77672633e 100644 --- a/llvm/lib/Support/APFloat.cpp +++ b/llvm/lib/Support/APFloat.cpp @@ -2543,12 +2543,12 @@ IEEEFloat::convertFromDecimalString(StringRef str, roundingMode rounding_mode) { } bool IEEEFloat::convertFromStringSpecials(StringRef str) { - if (str.equals("inf") || str.equals("INFINITY")) { + if (str.equals("inf") || str.equals("INFINITY") || str.equals("+Inf")) { makeInf(false); return true; } - if (str.equals("-inf") || str.equals("-INFINITY")) { + if (str.equals("-inf") || str.equals("-INFINITY") || str.equals("-Inf")) { makeInf(true); return true; } diff --git a/llvm/unittests/ADT/APFloatTest.cpp b/llvm/unittests/ADT/APFloatTest.cpp index 280a0862ccc..a0d3e97c3ec 100644 --- a/llvm/unittests/ADT/APFloatTest.cpp +++ b/llvm/unittests/ADT/APFloatTest.cpp @@ -849,6 +849,22 @@ TEST(APFloatTest, fromDecimalString) { EXPECT_EQ(2.71828, convertToDoubleFromString("2.71828")); } +TEST(APFloatTest, fromToStringSpecials) { + auto roundTrip = [] (const char* str) { + return convertToString(convertToDoubleFromString(str), 0, 3).c_str(); + }; + EXPECT_STREQ("+Inf", roundTrip("+Inf")); + EXPECT_STREQ("+Inf", roundTrip("INFINITY")); + EXPECT_STREQ("+Inf", roundTrip("inf")); + EXPECT_STREQ("-Inf", roundTrip("-Inf")); + EXPECT_STREQ("-Inf", roundTrip("-INFINITY")); + EXPECT_STREQ("-Inf", roundTrip("-inf")); + EXPECT_STREQ("NaN", roundTrip("NaN")); + EXPECT_STREQ("NaN", roundTrip("nan")); + EXPECT_STREQ("NaN", roundTrip("-NaN")); + EXPECT_STREQ("NaN", roundTrip("-nan")); +} + TEST(APFloatTest, fromHexadecimalString) { EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble(), "0x1p0").convertToDouble()); EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble(), "+0x1p0").convertToDouble()); |