#include "llvm/Support/CheckedArithmetic.h" #include "gtest/gtest.h" using namespace llvm; namespace { TEST(CheckedArithmetic, CheckedAdd) { int64_t Out; const int64_t Max = std::numeric_limits::max(); const int64_t Min = std::numeric_limits::min(); EXPECT_EQ(checkedAdd(Max, Max, &Out), true); EXPECT_EQ(checkedAdd(Min, -1, &Out), true); EXPECT_EQ(checkedAdd(Max, 1, &Out), true); EXPECT_EQ(checkedAdd(10, 1, &Out), false); EXPECT_EQ(Out, 11); } TEST(CheckedArithmetic, CheckedAddSmall) { int16_t Out; const int16_t Max = std::numeric_limits::max(); const int16_t Min = std::numeric_limits::min(); EXPECT_EQ(checkedAdd(Max, Max, &Out), true); EXPECT_EQ(checkedAdd(Min, -1, &Out), true); EXPECT_EQ(checkedAdd(Max, 1, &Out), true); EXPECT_EQ(checkedAdd(10, 1, &Out), false); EXPECT_EQ(Out, 11); } TEST(CheckedArithmetic, CheckedMul) { int64_t Out; const int64_t Max = std::numeric_limits::max(); const int64_t Min = std::numeric_limits::min(); EXPECT_EQ(checkedMul(Max, 2, &Out), true); EXPECT_EQ(checkedMul(Max, Max, &Out), true); EXPECT_EQ(checkedMul(Min, 2, &Out), true); EXPECT_EQ(checkedMul(10, 2, &Out), false); EXPECT_EQ(Out, 20); } TEST(CheckedArithmetic, CheckedMulSmall) { int16_t Out; const int16_t Max = std::numeric_limits::max(); const int16_t Min = std::numeric_limits::min(); EXPECT_EQ(checkedMul(Max, 2, &Out), true); EXPECT_EQ(checkedMul(Max, Max, &Out), true); EXPECT_EQ(checkedMul(Min, 2, &Out), true); EXPECT_EQ(checkedMul(10, 2, &Out), false); EXPECT_EQ(Out, 20); } TEST(CheckedArithmetic, CheckedAddUnsigned) { uint64_t Out; const uint64_t Max = std::numeric_limits::max(); EXPECT_EQ(checkedAddUnsigned(Max, Max, &Out), true); EXPECT_EQ(checkedAddUnsigned(Max, 1, &Out), true); EXPECT_EQ(checkedAddUnsigned(10, 1, &Out), false); EXPECT_EQ(Out, uint64_t(11)); } TEST(CheckedArithmetic, CheckedMulUnsigned) { uint64_t Out; const uint64_t Max = std::numeric_limits::max(); EXPECT_EQ(checkedMulUnsigned(Max, 2, &Out), true); EXPECT_EQ(checkedMulUnsigned(Max, Max, &Out), true); EXPECT_EQ(checkedMulUnsigned(10, 2, &Out), false); EXPECT_EQ(Out, uint64_t(20)); } } // namespace