Home | History | Annotate | Download | only in Support
      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, CheckedMulAdd) {
     36   const int64_t Max = std::numeric_limits<int64_t>::max();
     37   const int64_t Min = std::numeric_limits<int64_t>::min();
     38   EXPECT_EQ(checkedMulAdd<int64_t>(Max, 1, 2), None);
     39   EXPECT_EQ(checkedMulAdd<int64_t>(1, 1, Max), None);
     40   EXPECT_EQ(checkedMulAdd<int64_t>(1, -1, Min), None);
     41   EXPECT_EQ(checkedMulAdd<int64_t>(10, 2, 3), Optional<int64_t>(23));
     42 }
     43 
     44 TEST(CheckedArithmetic, CheckedMulSmall) {
     45   const int16_t Max = std::numeric_limits<int16_t>::max();
     46   const int16_t Min = std::numeric_limits<int16_t>::min();
     47   EXPECT_EQ(checkedMul<int16_t>(Max, 2), None);
     48   EXPECT_EQ(checkedMul<int16_t>(Max, Max), None);
     49   EXPECT_EQ(checkedMul<int16_t>(Min, 2), None);
     50   EXPECT_EQ(checkedMul<int16_t>(10, 2), Optional<int16_t>(20));
     51 }
     52 
     53 TEST(CheckedArithmetic, CheckedMulAddSmall) {
     54   const int16_t Max = std::numeric_limits<int16_t>::max();
     55   const int16_t Min = std::numeric_limits<int16_t>::min();
     56   EXPECT_EQ(checkedMulAdd<int16_t>(Max, 1, 2), None);
     57   EXPECT_EQ(checkedMulAdd<int16_t>(1, 1, Max), None);
     58   EXPECT_EQ(checkedMulAdd<int16_t>(1, -1, Min), None);
     59   EXPECT_EQ(checkedMulAdd<int16_t>(10, 2, 3), Optional<int16_t>(23));
     60 }
     61 
     62 TEST(CheckedArithmetic, CheckedAddUnsigned) {
     63   const uint64_t Max = std::numeric_limits<uint64_t>::max();
     64   EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, Max), None);
     65   EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, 1), None);
     66   EXPECT_EQ(checkedAddUnsigned<uint64_t>(10, 1), Optional<uint64_t>(11));
     67 }
     68 
     69 TEST(CheckedArithmetic, CheckedMulUnsigned) {
     70   const uint64_t Max = std::numeric_limits<uint64_t>::max();
     71   EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, 2), llvm::None);
     72   EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, Max), llvm::None);
     73   EXPECT_EQ(checkedMulUnsigned<uint64_t>(10, 2), Optional<uint64_t>(20));
     74 }
     75 
     76 TEST(CheckedArithmetic, CheckedMulAddUnsigned) {
     77   const uint64_t Max = std::numeric_limits<uint64_t>::max();
     78   EXPECT_EQ(checkedMulAddUnsigned<uint64_t>(Max, 1, 2), None);
     79   EXPECT_EQ(checkedMulAddUnsigned<uint64_t>(1, 1, Max), None);
     80   EXPECT_EQ(checkedMulAddUnsigned<uint64_t>(10, 2, 3), Optional<uint64_t>(23));
     81 }
     82 
     83 
     84 } // namespace
     85