summaryrefslogtreecommitdiffstats
path: root/llvm/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
commit3bbaeaf673811c69bf7bb034b6be73b77d7062a1 (patch)
tree75ed563c9539b5b38624484aeda228c2910d1814 /llvm/unittests/Support/CheckedArithmeticTest.cpp
parent0ffb2271a1e60de368fc6b0b1df4595220981a8d (diff)
downloadbcm5719-llvm-3bbaeaf673811c69bf7bb034b6be73b77d7062a1.tar.gz
bcm5719-llvm-3bbaeaf673811c69bf7bb034b6be73b77d7062a1.zip
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 llvm-svn: 334634
Diffstat (limited to 'llvm/unittests/Support/CheckedArithmeticTest.cpp')
-rw-r--r--llvm/unittests/Support/CheckedArithmeticTest.cpp56
1 files changed, 22 insertions, 34 deletions
diff --git a/llvm/unittests/Support/CheckedArithmeticTest.cpp b/llvm/unittests/Support/CheckedArithmeticTest.cpp
index 7fc63498e2b..f797a9ed41e 100644
--- a/llvm/unittests/Support/CheckedArithmeticTest.cpp
+++ b/llvm/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));
}
OpenPOWER on IntegriCloud