diff options
Diffstat (limited to 'unittests/ADT/APFloatTest.cpp')
| -rw-r--r-- | unittests/ADT/APFloatTest.cpp | 49 | 
1 files changed, 49 insertions, 0 deletions
diff --git a/unittests/ADT/APFloatTest.cpp b/unittests/ADT/APFloatTest.cpp index 5f05b8616933..08ac2a05254a 100644 --- a/unittests/ADT/APFloatTest.cpp +++ b/unittests/ADT/APFloatTest.cpp @@ -12,6 +12,7 @@  #include "llvm/Support/raw_ostream.h"  #include "gtest/gtest.h"  #include "llvm/ADT/APFloat.h" +#include "llvm/ADT/APSInt.h"  #include "llvm/ADT/SmallString.h"  #include "llvm/ADT/SmallVector.h" @@ -344,6 +345,54 @@ TEST(APFloatTest, toString) {    ASSERT_EQ("8.731834E+2", convertToString(873.1834, 0, 0));  } +TEST(APFloatTest, toInteger) { +  bool isExact = false; +  APSInt result(5, /*isUnsigned=*/true); + +  EXPECT_EQ(APFloat::opOK, +            APFloat(APFloat::IEEEdouble, "10") +            .convertToInteger(result, APFloat::rmTowardZero, &isExact)); +  EXPECT_TRUE(isExact); +  EXPECT_EQ(APSInt(APInt(5, 10), true), result); + +  EXPECT_EQ(APFloat::opInvalidOp, +            APFloat(APFloat::IEEEdouble, "-10") +            .convertToInteger(result, APFloat::rmTowardZero, &isExact)); +  EXPECT_FALSE(isExact); +  EXPECT_EQ(APSInt::getMinValue(5, true), result); + +  EXPECT_EQ(APFloat::opInvalidOp, +            APFloat(APFloat::IEEEdouble, "32") +            .convertToInteger(result, APFloat::rmTowardZero, &isExact)); +  EXPECT_FALSE(isExact); +  EXPECT_EQ(APSInt::getMaxValue(5, true), result); + +  EXPECT_EQ(APFloat::opInexact, +            APFloat(APFloat::IEEEdouble, "7.9") +            .convertToInteger(result, APFloat::rmTowardZero, &isExact)); +  EXPECT_FALSE(isExact); +  EXPECT_EQ(APSInt(APInt(5, 7), true), result); + +  result.setIsUnsigned(false); +  EXPECT_EQ(APFloat::opOK, +            APFloat(APFloat::IEEEdouble, "-10") +            .convertToInteger(result, APFloat::rmTowardZero, &isExact)); +  EXPECT_TRUE(isExact); +  EXPECT_EQ(APSInt(APInt(5, -10, true), false), result); + +  EXPECT_EQ(APFloat::opInvalidOp, +            APFloat(APFloat::IEEEdouble, "-17") +            .convertToInteger(result, APFloat::rmTowardZero, &isExact)); +  EXPECT_FALSE(isExact); +  EXPECT_EQ(APSInt::getMinValue(5, false), result); + +  EXPECT_EQ(APFloat::opInvalidOp, +            APFloat(APFloat::IEEEdouble, "16") +            .convertToInteger(result, APFloat::rmTowardZero, &isExact)); +  EXPECT_FALSE(isExact); +  EXPECT_EQ(APSInt::getMaxValue(5, false), result); +} +  static APInt nanbits(const fltSemantics &Sem,                       bool SNaN, bool Negative, uint64_t fill) {    APInt apfill(64, fill);  | 
