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 int64_t Out; 10 const int64_t Max = std::numeric_limits<int64_t>::max(); 11 const int64_t Min = std::numeric_limits<int64_t>::min(); 12 EXPECT_EQ(checkedAdd<int64_t>(Max, Max, &Out), true); 13 EXPECT_EQ(checkedAdd<int64_t>(Min, -1, &Out), true); 14 EXPECT_EQ(checkedAdd<int64_t>(Max, 1, &Out), true); 15 EXPECT_EQ(checkedAdd<int64_t>(10, 1, &Out), false); 16 EXPECT_EQ(Out, 11); 17 } 18 19 TEST(CheckedArithmetic, CheckedAddSmall) { 20 int16_t Out; 21 const int16_t Max = std::numeric_limits<int16_t>::max(); 22 const int16_t Min = std::numeric_limits<int16_t>::min(); 23 EXPECT_EQ(checkedAdd<int16_t>(Max, Max, &Out), true); 24 EXPECT_EQ(checkedAdd<int16_t>(Min, -1, &Out), true); 25 EXPECT_EQ(checkedAdd<int16_t>(Max, 1, &Out), true); 26 EXPECT_EQ(checkedAdd<int16_t>(10, 1, &Out), false); 27 EXPECT_EQ(Out, 11); 28 } 29 30 TEST(CheckedArithmetic, CheckedMul) { 31 int64_t Out; 32 const int64_t Max = std::numeric_limits<int64_t>::max(); 33 const int64_t Min = std::numeric_limits<int64_t>::min(); 34 EXPECT_EQ(checkedMul<int64_t>(Max, 2, &Out), true); 35 EXPECT_EQ(checkedMul<int64_t>(Max, Max, &Out), true); 36 EXPECT_EQ(checkedMul<int64_t>(Min, 2, &Out), true); 37 EXPECT_EQ(checkedMul<int64_t>(10, 2, &Out), false); 38 EXPECT_EQ(Out, 20); 39 } 40 41 TEST(CheckedArithmetic, CheckedMulSmall) { 42 int16_t Out; 43 const int16_t Max = std::numeric_limits<int16_t>::max(); 44 const int16_t Min = std::numeric_limits<int16_t>::min(); 45 EXPECT_EQ(checkedMul<int16_t>(Max, 2, &Out), true); 46 EXPECT_EQ(checkedMul<int16_t>(Max, Max, &Out), true); 47 EXPECT_EQ(checkedMul<int16_t>(Min, 2, &Out), true); 48 EXPECT_EQ(checkedMul<int16_t>(10, 2, &Out), false); 49 EXPECT_EQ(Out, 20); 50 } 51 52 TEST(CheckedArithmetic, CheckedAddUnsigned) { 53 uint64_t Out; 54 const uint64_t Max = std::numeric_limits<uint64_t>::max(); 55 EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, Max, &Out), true); 56 EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, 1, &Out), true); 57 EXPECT_EQ(checkedAddUnsigned<uint64_t>(10, 1, &Out), false); 58 EXPECT_EQ(Out, uint64_t(11)); 59 } 60 61 TEST(CheckedArithmetic, CheckedMulUnsigned) { 62 uint64_t Out; 63 const uint64_t Max = std::numeric_limits<uint64_t>::max(); 64 EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, 2, &Out), true); 65 EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, Max, &Out), true); 66 EXPECT_EQ(checkedMulUnsigned<uint64_t>(10, 2, &Out), false); 67 EXPECT_EQ(Out, uint64_t(20)); 68 } 69 70 71 } // namespace 72