13f547fe8SGeorge Karpenkov #include "llvm/Support/CheckedArithmetic.h"
23f547fe8SGeorge Karpenkov #include "gtest/gtest.h"
33f547fe8SGeorge Karpenkov
43f547fe8SGeorge Karpenkov using namespace llvm;
53f547fe8SGeorge Karpenkov
63f547fe8SGeorge Karpenkov namespace {
73f547fe8SGeorge Karpenkov
TEST(CheckedArithmetic,CheckedAdd)83f547fe8SGeorge Karpenkov TEST(CheckedArithmetic, CheckedAdd) {
93f547fe8SGeorge Karpenkov const int64_t Max = std::numeric_limits<int64_t>::max();
103f547fe8SGeorge Karpenkov const int64_t Min = std::numeric_limits<int64_t>::min();
11b6a01caaSKazu Hirata EXPECT_EQ(checkedAdd<int64_t>(Max, Max), std::nullopt);
12b6a01caaSKazu Hirata EXPECT_EQ(checkedAdd<int64_t>(Min, -1), std::nullopt);
13b6a01caaSKazu Hirata EXPECT_EQ(checkedAdd<int64_t>(Max, 1), std::nullopt);
14*3dfacc0aSFangrui Song EXPECT_EQ(checkedAdd<int64_t>(10, 1), std::optional<int64_t>(11));
153f547fe8SGeorge Karpenkov }
163f547fe8SGeorge Karpenkov
TEST(CheckedArithmetic,CheckedAddSmall)173f547fe8SGeorge Karpenkov TEST(CheckedArithmetic, CheckedAddSmall) {
183f547fe8SGeorge Karpenkov const int16_t Max = std::numeric_limits<int16_t>::max();
193f547fe8SGeorge Karpenkov const int16_t Min = std::numeric_limits<int16_t>::min();
20b6a01caaSKazu Hirata EXPECT_EQ(checkedAdd<int16_t>(Max, Max), std::nullopt);
21b6a01caaSKazu Hirata EXPECT_EQ(checkedAdd<int16_t>(Min, -1), std::nullopt);
22b6a01caaSKazu Hirata EXPECT_EQ(checkedAdd<int16_t>(Max, 1), std::nullopt);
23*3dfacc0aSFangrui Song EXPECT_EQ(checkedAdd<int16_t>(10, 1), std::optional<int64_t>(11));
243f547fe8SGeorge Karpenkov }
253f547fe8SGeorge Karpenkov
TEST(CheckedArithmetic,CheckedMul)263f547fe8SGeorge Karpenkov TEST(CheckedArithmetic, CheckedMul) {
273f547fe8SGeorge Karpenkov const int64_t Max = std::numeric_limits<int64_t>::max();
283f547fe8SGeorge Karpenkov const int64_t Min = std::numeric_limits<int64_t>::min();
29b6a01caaSKazu Hirata EXPECT_EQ(checkedMul<int64_t>(Max, 2), std::nullopt);
30b6a01caaSKazu Hirata EXPECT_EQ(checkedMul<int64_t>(Max, Max), std::nullopt);
31b6a01caaSKazu Hirata EXPECT_EQ(checkedMul<int64_t>(Min, 2), std::nullopt);
32*3dfacc0aSFangrui Song EXPECT_EQ(checkedMul<int64_t>(10, 2), std::optional<int64_t>(20));
333f547fe8SGeorge Karpenkov }
343f547fe8SGeorge Karpenkov
TEST(CheckedArithmetic,CheckedMulAdd)35788087f5SGeorge Karpenkov TEST(CheckedArithmetic, CheckedMulAdd) {
36788087f5SGeorge Karpenkov const int64_t Max = std::numeric_limits<int64_t>::max();
37788087f5SGeorge Karpenkov const int64_t Min = std::numeric_limits<int64_t>::min();
38b6a01caaSKazu Hirata EXPECT_EQ(checkedMulAdd<int64_t>(Max, 1, 2), std::nullopt);
39b6a01caaSKazu Hirata EXPECT_EQ(checkedMulAdd<int64_t>(1, 1, Max), std::nullopt);
40b6a01caaSKazu Hirata EXPECT_EQ(checkedMulAdd<int64_t>(1, -1, Min), std::nullopt);
41*3dfacc0aSFangrui Song EXPECT_EQ(checkedMulAdd<int64_t>(10, 2, 3), std::optional<int64_t>(23));
42788087f5SGeorge Karpenkov }
43788087f5SGeorge Karpenkov
TEST(CheckedArithmetic,CheckedMulSmall)443f547fe8SGeorge Karpenkov TEST(CheckedArithmetic, CheckedMulSmall) {
453f547fe8SGeorge Karpenkov const int16_t Max = std::numeric_limits<int16_t>::max();
463f547fe8SGeorge Karpenkov const int16_t Min = std::numeric_limits<int16_t>::min();
47b6a01caaSKazu Hirata EXPECT_EQ(checkedMul<int16_t>(Max, 2), std::nullopt);
48b6a01caaSKazu Hirata EXPECT_EQ(checkedMul<int16_t>(Max, Max), std::nullopt);
49b6a01caaSKazu Hirata EXPECT_EQ(checkedMul<int16_t>(Min, 2), std::nullopt);
50*3dfacc0aSFangrui Song EXPECT_EQ(checkedMul<int16_t>(10, 2), std::optional<int16_t>(20));
513f547fe8SGeorge Karpenkov }
523f547fe8SGeorge Karpenkov
TEST(CheckedArithmetic,CheckedMulAddSmall)53788087f5SGeorge Karpenkov TEST(CheckedArithmetic, CheckedMulAddSmall) {
54788087f5SGeorge Karpenkov const int16_t Max = std::numeric_limits<int16_t>::max();
55788087f5SGeorge Karpenkov const int16_t Min = std::numeric_limits<int16_t>::min();
56b6a01caaSKazu Hirata EXPECT_EQ(checkedMulAdd<int16_t>(Max, 1, 2), std::nullopt);
57b6a01caaSKazu Hirata EXPECT_EQ(checkedMulAdd<int16_t>(1, 1, Max), std::nullopt);
58b6a01caaSKazu Hirata EXPECT_EQ(checkedMulAdd<int16_t>(1, -1, Min), std::nullopt);
59*3dfacc0aSFangrui Song EXPECT_EQ(checkedMulAdd<int16_t>(10, 2, 3), std::optional<int16_t>(23));
60788087f5SGeorge Karpenkov }
61788087f5SGeorge Karpenkov
TEST(CheckedArithmetic,CheckedAddUnsigned)623f547fe8SGeorge Karpenkov TEST(CheckedArithmetic, CheckedAddUnsigned) {
633f547fe8SGeorge Karpenkov const uint64_t Max = std::numeric_limits<uint64_t>::max();
64b6a01caaSKazu Hirata EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, Max), std::nullopt);
65b6a01caaSKazu Hirata EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, 1), std::nullopt);
66*3dfacc0aSFangrui Song EXPECT_EQ(checkedAddUnsigned<uint64_t>(10, 1), std::optional<uint64_t>(11));
673f547fe8SGeorge Karpenkov }
683f547fe8SGeorge Karpenkov
TEST(CheckedArithmetic,CheckedMulUnsigned)693f547fe8SGeorge Karpenkov TEST(CheckedArithmetic, CheckedMulUnsigned) {
703f547fe8SGeorge Karpenkov const uint64_t Max = std::numeric_limits<uint64_t>::max();
71b6a01caaSKazu Hirata EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, 2), std::nullopt);
72b6a01caaSKazu Hirata EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, Max), std::nullopt);
73*3dfacc0aSFangrui Song EXPECT_EQ(checkedMulUnsigned<uint64_t>(10, 2), std::optional<uint64_t>(20));
743f547fe8SGeorge Karpenkov }
753f547fe8SGeorge Karpenkov
TEST(CheckedArithmetic,CheckedMulAddUnsigned)76788087f5SGeorge Karpenkov TEST(CheckedArithmetic, CheckedMulAddUnsigned) {
77788087f5SGeorge Karpenkov const uint64_t Max = std::numeric_limits<uint64_t>::max();
78b6a01caaSKazu Hirata EXPECT_EQ(checkedMulAddUnsigned<uint64_t>(Max, 1, 2), std::nullopt);
79b6a01caaSKazu Hirata EXPECT_EQ(checkedMulAddUnsigned<uint64_t>(1, 1, Max), std::nullopt);
80*3dfacc0aSFangrui Song EXPECT_EQ(checkedMulAddUnsigned<uint64_t>(10, 2, 3), std::optional<uint64_t>(23));
81788087f5SGeorge Karpenkov }
82788087f5SGeorge Karpenkov
833f547fe8SGeorge Karpenkov
843f547fe8SGeorge Karpenkov } // namespace
85