1 #include "llvm/Support/CheckedArithmetic.h" 2 #include "gtest/gtest.h" 3 4 using namespace llvm; 5 6 namespace { 7 8 TEST(CheckedArithmetic, CheckedAdd) { 9 const int64_t Max = std::numeric_limits<int64_t>::max(); 10 const int64_t Min = std::numeric_limits<int64_t>::min(); 11 EXPECT_EQ(checkedAdd<int64_t>(Max, Max), None); 12 EXPECT_EQ(checkedAdd<int64_t>(Min, -1), None); 13 EXPECT_EQ(checkedAdd<int64_t>(Max, 1), None); 14 EXPECT_EQ(checkedAdd<int64_t>(10, 1), Optional<int64_t>(11)); 15 } 16 17 TEST(CheckedArithmetic, CheckedAddSmall) { 18 const int16_t Max = std::numeric_limits<int16_t>::max(); 19 const int16_t Min = std::numeric_limits<int16_t>::min(); 20 EXPECT_EQ(checkedAdd<int16_t>(Max, Max), None); 21 EXPECT_EQ(checkedAdd<int16_t>(Min, -1), None); 22 EXPECT_EQ(checkedAdd<int16_t>(Max, 1), None); 23 EXPECT_EQ(checkedAdd<int16_t>(10, 1), Optional<int64_t>(11)); 24 } 25 26 TEST(CheckedArithmetic, CheckedMul) { 27 const int64_t Max = std::numeric_limits<int64_t>::max(); 28 const int64_t Min = std::numeric_limits<int64_t>::min(); 29 EXPECT_EQ(checkedMul<int64_t>(Max, 2), None); 30 EXPECT_EQ(checkedMul<int64_t>(Max, Max), None); 31 EXPECT_EQ(checkedMul<int64_t>(Min, 2), None); 32 EXPECT_EQ(checkedMul<int64_t>(10, 2), Optional<int64_t>(20)); 33 } 34 35 TEST(CheckedArithmetic, CheckedMulSmall) { 36 const int16_t Max = std::numeric_limits<int16_t>::max(); 37 const int16_t Min = std::numeric_limits<int16_t>::min(); 38 EXPECT_EQ(checkedMul<int16_t>(Max, 2), None); 39 EXPECT_EQ(checkedMul<int16_t>(Max, Max), None); 40 EXPECT_EQ(checkedMul<int16_t>(Min, 2), None); 41 EXPECT_EQ(checkedMul<int16_t>(10, 2), Optional<int16_t>(20)); 42 } 43 44 TEST(CheckedArithmetic, CheckedAddUnsigned) { 45 const uint64_t Max = std::numeric_limits<uint64_t>::max(); 46 EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, Max), None); 47 EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, 1), None); 48 EXPECT_EQ(checkedAddUnsigned<uint64_t>(10, 1), Optional<uint64_t>(11)); 49 } 50 51 TEST(CheckedArithmetic, CheckedMulUnsigned) { 52 const uint64_t Max = std::numeric_limits<uint64_t>::max(); 53 EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, 2), llvm::None); 54 EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, Max), llvm::None); 55 EXPECT_EQ(checkedMulUnsigned<uint64_t>(10, 2), Optional<uint64_t>(20)); 56 } 57 58 59 } // namespace 60