summaryrefslogtreecommitdiff
path: root/unittests/Support/CheckedArithmeticTest.cpp
diff options
context:
space:
mode:
authorGeorge Karpenkov <ekarpenkov@apple.com>2018-06-13 18:31:43 +0000
committerGeorge Karpenkov <ekarpenkov@apple.com>2018-06-13 18:31:43 +0000
commitba86f98ba71d995dc8d91b2e737ee09f4d59fd14 (patch)
treede103e967e7b8ba0e355e74f36d5920d0abfd1d3 /unittests/Support/CheckedArithmeticTest.cpp
parent2a8508d8ca6c3fb3f4b33438ec6ccd7111ffe8be (diff)
Change checked arithmetic functions API to return Optional
Returning optional is much safer. The previous API had potential to cause use of undefined variables, if the value passed by pointer was accidentally read afterwards. Differential Revision: https://reviews.llvm.org/D48137 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334634 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests/Support/CheckedArithmeticTest.cpp')
-rw-r--r--unittests/Support/CheckedArithmeticTest.cpp56
1 files changed, 22 insertions, 34 deletions
diff --git a/unittests/Support/CheckedArithmeticTest.cpp b/unittests/Support/CheckedArithmeticTest.cpp
index 7fc63498e2b..f797a9ed41e 100644
--- a/unittests/Support/CheckedArithmeticTest.cpp
+++ b/unittests/Support/CheckedArithmeticTest.cpp
@@ -6,65 +6,53 @@ using namespace llvm;
namespace {
TEST(CheckedArithmetic, CheckedAdd) {
- int64_t Out;
const int64_t Max = std::numeric_limits<int64_t>::max();
const int64_t Min = std::numeric_limits<int64_t>::min();
- EXPECT_EQ(checkedAdd<int64_t>(Max, Max, &Out), true);
- EXPECT_EQ(checkedAdd<int64_t>(Min, -1, &Out), true);
- EXPECT_EQ(checkedAdd<int64_t>(Max, 1, &Out), true);
- EXPECT_EQ(checkedAdd<int64_t>(10, 1, &Out), false);
- EXPECT_EQ(Out, 11);
+ EXPECT_EQ(checkedAdd<int64_t>(Max, Max), None);
+ EXPECT_EQ(checkedAdd<int64_t>(Min, -1), None);
+ EXPECT_EQ(checkedAdd<int64_t>(Max, 1), None);
+ EXPECT_EQ(checkedAdd<int64_t>(10, 1), Optional<int64_t>(11));
}
TEST(CheckedArithmetic, CheckedAddSmall) {
- int16_t Out;
const int16_t Max = std::numeric_limits<int16_t>::max();
const int16_t Min = std::numeric_limits<int16_t>::min();
- EXPECT_EQ(checkedAdd<int16_t>(Max, Max, &Out), true);
- EXPECT_EQ(checkedAdd<int16_t>(Min, -1, &Out), true);
- EXPECT_EQ(checkedAdd<int16_t>(Max, 1, &Out), true);
- EXPECT_EQ(checkedAdd<int16_t>(10, 1, &Out), false);
- EXPECT_EQ(Out, 11);
+ EXPECT_EQ(checkedAdd<int16_t>(Max, Max), None);
+ EXPECT_EQ(checkedAdd<int16_t>(Min, -1), None);
+ EXPECT_EQ(checkedAdd<int16_t>(Max, 1), None);
+ EXPECT_EQ(checkedAdd<int16_t>(10, 1), Optional<int64_t>(11));
}
TEST(CheckedArithmetic, CheckedMul) {
- int64_t Out;
const int64_t Max = std::numeric_limits<int64_t>::max();
const int64_t Min = std::numeric_limits<int64_t>::min();
- EXPECT_EQ(checkedMul<int64_t>(Max, 2, &Out), true);
- EXPECT_EQ(checkedMul<int64_t>(Max, Max, &Out), true);
- EXPECT_EQ(checkedMul<int64_t>(Min, 2, &Out), true);
- EXPECT_EQ(checkedMul<int64_t>(10, 2, &Out), false);
- EXPECT_EQ(Out, 20);
+ EXPECT_EQ(checkedMul<int64_t>(Max, 2), None);
+ EXPECT_EQ(checkedMul<int64_t>(Max, Max), None);
+ EXPECT_EQ(checkedMul<int64_t>(Min, 2), None);
+ EXPECT_EQ(checkedMul<int64_t>(10, 2), Optional<int64_t>(20));
}
TEST(CheckedArithmetic, CheckedMulSmall) {
- int16_t Out;
const int16_t Max = std::numeric_limits<int16_t>::max();
const int16_t Min = std::numeric_limits<int16_t>::min();
- EXPECT_EQ(checkedMul<int16_t>(Max, 2, &Out), true);
- EXPECT_EQ(checkedMul<int16_t>(Max, Max, &Out), true);
- EXPECT_EQ(checkedMul<int16_t>(Min, 2, &Out), true);
- EXPECT_EQ(checkedMul<int16_t>(10, 2, &Out), false);
- EXPECT_EQ(Out, 20);
+ EXPECT_EQ(checkedMul<int16_t>(Max, 2), None);
+ EXPECT_EQ(checkedMul<int16_t>(Max, Max), None);
+ EXPECT_EQ(checkedMul<int16_t>(Min, 2), None);
+ EXPECT_EQ(checkedMul<int16_t>(10, 2), Optional<int16_t>(20));
}
TEST(CheckedArithmetic, CheckedAddUnsigned) {
- uint64_t Out;
const uint64_t Max = std::numeric_limits<uint64_t>::max();
- EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, Max, &Out), true);
- EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, 1, &Out), true);
- EXPECT_EQ(checkedAddUnsigned<uint64_t>(10, 1, &Out), false);
- EXPECT_EQ(Out, uint64_t(11));
+ EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, Max), None);
+ EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, 1), None);
+ EXPECT_EQ(checkedAddUnsigned<uint64_t>(10, 1), Optional<uint64_t>(11));
}
TEST(CheckedArithmetic, CheckedMulUnsigned) {
- uint64_t Out;
const uint64_t Max = std::numeric_limits<uint64_t>::max();
- EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, 2, &Out), true);
- EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, Max, &Out), true);
- EXPECT_EQ(checkedMulUnsigned<uint64_t>(10, 2, &Out), false);
- EXPECT_EQ(Out, uint64_t(20));
+ EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, 2), llvm::None);
+ EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, Max), llvm::None);
+ EXPECT_EQ(checkedMulUnsigned<uint64_t>(10, 2), Optional<uint64_t>(20));
}