From 156f9e8a04e21fca4c50d8388723b7eb75a44b3c Mon Sep 17 00:00:00 2001 From: Diego Novillo Date: Thu, 30 Apr 2015 13:22:48 +0000 Subject: [PATCH] Fix private constructor for ScaledNumber. Summary: The private constructor for ScaledNumber was using uint64_t instead of DigitsT. This was preventing instantiations of ScaledNumber with anything other than uint64_t types. In implementing the tests, I ran into another issue. Operators >>= and <<= did not have variants for accepting other ScaledNumber as the shift argument. This is expected by the SCALED_NUMBER_BOP. It makes no sense to allow shifting a ScaledNumber by another ScaledNumber, so the patch includes two new templates for shifting ScaledNumbers. Reviewers: dexonsmith Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D9350 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236232 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/ScaledNumber.h | 16 +++++++++++++--- unittests/Support/ScaledNumberTest.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/include/llvm/Support/ScaledNumber.h b/include/llvm/Support/ScaledNumber.h index a1c4c80c356..dbe88f2e96f 100644 --- a/include/llvm/Support/ScaledNumber.h +++ b/include/llvm/Support/ScaledNumber.h @@ -514,7 +514,7 @@ public: : Digits(Digits), Scale(Scale) {} private: - ScaledNumber(const std::pair &X) + ScaledNumber(const std::pair &X) : Digits(X.first), Scale(X.second) {} public: @@ -732,10 +732,20 @@ SCALED_NUMBER_BOP(+, += ) SCALED_NUMBER_BOP(-, -= ) SCALED_NUMBER_BOP(*, *= ) SCALED_NUMBER_BOP(/, /= ) -SCALED_NUMBER_BOP(<<, <<= ) -SCALED_NUMBER_BOP(>>, >>= ) #undef SCALED_NUMBER_BOP +template +ScaledNumber operator<<(const ScaledNumber &L, + int16_t Shift) { + return ScaledNumber(L) <<= Shift; +} + +template +ScaledNumber operator>>(const ScaledNumber &L, + int16_t Shift) { + return ScaledNumber(L) >>= Shift; +} + template raw_ostream &operator<<(raw_ostream &OS, const ScaledNumber &X) { return X.print(OS, 10); diff --git a/unittests/Support/ScaledNumberTest.cpp b/unittests/Support/ScaledNumberTest.cpp index 216292cc265..38721552ec9 100644 --- a/unittests/Support/ScaledNumberTest.cpp +++ b/unittests/Support/ScaledNumberTest.cpp @@ -532,4 +532,28 @@ TEST(ScaledNumberHelpersTest, getDifference) { EXPECT_EQ(SP64(0, 0), getDifference64(1, -64, 1, -1)); } +TEST(ScaledNumberHelpersTest, arithmeticOperators) { + EXPECT_EQ(ScaledNumber(10, 0), + ScaledNumber(1, 3) + ScaledNumber(1, 1)); + EXPECT_EQ(ScaledNumber(6, 0), + ScaledNumber(1, 3) - ScaledNumber(1, 1)); + EXPECT_EQ(ScaledNumber(2, 3), + ScaledNumber(1, 3) * ScaledNumber(1, 1)); + EXPECT_EQ(ScaledNumber(1, 2), + ScaledNumber(1, 3) / ScaledNumber(1, 1)); + EXPECT_EQ(ScaledNumber(1, 2), ScaledNumber(1, 3) >> 1); + EXPECT_EQ(ScaledNumber(1, 4), ScaledNumber(1, 3) << 1); + + EXPECT_EQ(ScaledNumber(10, 0), + ScaledNumber(1, 3) + ScaledNumber(1, 1)); + EXPECT_EQ(ScaledNumber(6, 0), + ScaledNumber(1, 3) - ScaledNumber(1, 1)); + EXPECT_EQ(ScaledNumber(2, 3), + ScaledNumber(1, 3) * ScaledNumber(1, 1)); + EXPECT_EQ(ScaledNumber(1, 2), + ScaledNumber(1, 3) / ScaledNumber(1, 1)); + EXPECT_EQ(ScaledNumber(1, 2), ScaledNumber(1, 3) >> 1); + EXPECT_EQ(ScaledNumber(1, 4), ScaledNumber(1, 3) << 1); +} + } // end namespace