teak-llvm/llvm/unittests/Support/CheckedArithmeticTest.cpp
George Karpenkov 3bbaeaf673 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
2018-06-13 18:31:43 +00:00

60 lines
2.2 KiB
C++

#include "llvm/Support/CheckedArithmetic.h"
#include "gtest/gtest.h"
using namespace llvm;
namespace {
TEST(CheckedArithmetic, CheckedAdd) {
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), 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) {
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), 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) {
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), 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) {
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), 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) {
const uint64_t Max = std::numeric_limits<uint64_t>::max();
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) {
const uint64_t Max = std::numeric_limits<uint64_t>::max();
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));
}
} // namespace