85 lines · cpp
1#include "llvm/Support/CheckedArithmetic.h"2#include "gtest/gtest.h"3 4using namespace llvm;5 6namespace {7 8TEST(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), std::nullopt);12 EXPECT_EQ(checkedAdd<int64_t>(Min, -1), std::nullopt);13 EXPECT_EQ(checkedAdd<int64_t>(Max, 1), std::nullopt);14 EXPECT_EQ(checkedAdd<int64_t>(10, 1), std::optional<int64_t>(11));15}16 17TEST(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), std::nullopt);21 EXPECT_EQ(checkedAdd<int16_t>(Min, -1), std::nullopt);22 EXPECT_EQ(checkedAdd<int16_t>(Max, 1), std::nullopt);23 EXPECT_EQ(checkedAdd<int16_t>(10, 1), std::optional<int64_t>(11));24}25 26TEST(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), std::nullopt);30 EXPECT_EQ(checkedMul<int64_t>(Max, Max), std::nullopt);31 EXPECT_EQ(checkedMul<int64_t>(Min, 2), std::nullopt);32 EXPECT_EQ(checkedMul<int64_t>(10, 2), std::optional<int64_t>(20));33}34 35TEST(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), std::nullopt);39 EXPECT_EQ(checkedMulAdd<int64_t>(1, 1, Max), std::nullopt);40 EXPECT_EQ(checkedMulAdd<int64_t>(1, -1, Min), std::nullopt);41 EXPECT_EQ(checkedMulAdd<int64_t>(10, 2, 3), std::optional<int64_t>(23));42}43 44TEST(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), std::nullopt);48 EXPECT_EQ(checkedMul<int16_t>(Max, Max), std::nullopt);49 EXPECT_EQ(checkedMul<int16_t>(Min, 2), std::nullopt);50 EXPECT_EQ(checkedMul<int16_t>(10, 2), std::optional<int16_t>(20));51}52 53TEST(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), std::nullopt);57 EXPECT_EQ(checkedMulAdd<int16_t>(1, 1, Max), std::nullopt);58 EXPECT_EQ(checkedMulAdd<int16_t>(1, -1, Min), std::nullopt);59 EXPECT_EQ(checkedMulAdd<int16_t>(10, 2, 3), std::optional<int16_t>(23));60}61 62TEST(CheckedArithmetic, CheckedAddUnsigned) {63 const uint64_t Max = std::numeric_limits<uint64_t>::max();64 EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, Max), std::nullopt);65 EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, 1), std::nullopt);66 EXPECT_EQ(checkedAddUnsigned<uint64_t>(10, 1), std::optional<uint64_t>(11));67}68 69TEST(CheckedArithmetic, CheckedMulUnsigned) {70 const uint64_t Max = std::numeric_limits<uint64_t>::max();71 EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, 2), std::nullopt);72 EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, Max), std::nullopt);73 EXPECT_EQ(checkedMulUnsigned<uint64_t>(10, 2), std::optional<uint64_t>(20));74}75 76TEST(CheckedArithmetic, CheckedMulAddUnsigned) {77 const uint64_t Max = std::numeric_limits<uint64_t>::max();78 EXPECT_EQ(checkedMulAddUnsigned<uint64_t>(Max, 1, 2), std::nullopt);79 EXPECT_EQ(checkedMulAddUnsigned<uint64_t>(1, 1, Max), std::nullopt);80 EXPECT_EQ(checkedMulAddUnsigned<uint64_t>(10, 2, 3), std::optional<uint64_t>(23));81}82 83 84} // namespace85