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();
113bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedAdd<int64_t>(Max, Max), None);
123bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedAdd<int64_t>(Min, -1), None);
133bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedAdd<int64_t>(Max, 1), None);
143bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedAdd<int64_t>(10, 1), 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();
203bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedAdd<int16_t>(Max, Max), None);
213bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedAdd<int16_t>(Min, -1), None);
223bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedAdd<int16_t>(Max, 1), None);
233bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedAdd<int16_t>(10, 1), 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();
293bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedMul<int64_t>(Max, 2), None);
303bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedMul<int64_t>(Max, Max), None);
313bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedMul<int64_t>(Min, 2), None);
323bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedMul<int64_t>(10, 2), Optional<int64_t>(20));
333f547fe8SGeorge Karpenkov }
343f547fe8SGeorge Karpenkov
TEST(CheckedArithmetic,CheckedMulAdd)35*788087f5SGeorge Karpenkov TEST(CheckedArithmetic, CheckedMulAdd) {
36*788087f5SGeorge Karpenkov const int64_t Max = std::numeric_limits<int64_t>::max();
37*788087f5SGeorge Karpenkov const int64_t Min = std::numeric_limits<int64_t>::min();
38*788087f5SGeorge Karpenkov EXPECT_EQ(checkedMulAdd<int64_t>(Max, 1, 2), None);
39*788087f5SGeorge Karpenkov EXPECT_EQ(checkedMulAdd<int64_t>(1, 1, Max), None);
40*788087f5SGeorge Karpenkov EXPECT_EQ(checkedMulAdd<int64_t>(1, -1, Min), None);
41*788087f5SGeorge Karpenkov EXPECT_EQ(checkedMulAdd<int64_t>(10, 2, 3), Optional<int64_t>(23));
42*788087f5SGeorge Karpenkov }
43*788087f5SGeorge 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();
473bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedMul<int16_t>(Max, 2), None);
483bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedMul<int16_t>(Max, Max), None);
493bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedMul<int16_t>(Min, 2), None);
503bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedMul<int16_t>(10, 2), Optional<int16_t>(20));
513f547fe8SGeorge Karpenkov }
523f547fe8SGeorge Karpenkov
TEST(CheckedArithmetic,CheckedMulAddSmall)53*788087f5SGeorge Karpenkov TEST(CheckedArithmetic, CheckedMulAddSmall) {
54*788087f5SGeorge Karpenkov const int16_t Max = std::numeric_limits<int16_t>::max();
55*788087f5SGeorge Karpenkov const int16_t Min = std::numeric_limits<int16_t>::min();
56*788087f5SGeorge Karpenkov EXPECT_EQ(checkedMulAdd<int16_t>(Max, 1, 2), None);
57*788087f5SGeorge Karpenkov EXPECT_EQ(checkedMulAdd<int16_t>(1, 1, Max), None);
58*788087f5SGeorge Karpenkov EXPECT_EQ(checkedMulAdd<int16_t>(1, -1, Min), None);
59*788087f5SGeorge Karpenkov EXPECT_EQ(checkedMulAdd<int16_t>(10, 2, 3), Optional<int16_t>(23));
60*788087f5SGeorge Karpenkov }
61*788087f5SGeorge Karpenkov
TEST(CheckedArithmetic,CheckedAddUnsigned)623f547fe8SGeorge Karpenkov TEST(CheckedArithmetic, CheckedAddUnsigned) {
633f547fe8SGeorge Karpenkov const uint64_t Max = std::numeric_limits<uint64_t>::max();
643bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, Max), None);
653bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, 1), None);
663bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedAddUnsigned<uint64_t>(10, 1), 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();
713bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, 2), llvm::None);
723bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, Max), llvm::None);
733bbaeaf6SGeorge Karpenkov EXPECT_EQ(checkedMulUnsigned<uint64_t>(10, 2), Optional<uint64_t>(20));
743f547fe8SGeorge Karpenkov }
753f547fe8SGeorge Karpenkov
TEST(CheckedArithmetic,CheckedMulAddUnsigned)76*788087f5SGeorge Karpenkov TEST(CheckedArithmetic, CheckedMulAddUnsigned) {
77*788087f5SGeorge Karpenkov const uint64_t Max = std::numeric_limits<uint64_t>::max();
78*788087f5SGeorge Karpenkov EXPECT_EQ(checkedMulAddUnsigned<uint64_t>(Max, 1, 2), None);
79*788087f5SGeorge Karpenkov EXPECT_EQ(checkedMulAddUnsigned<uint64_t>(1, 1, Max), None);
80*788087f5SGeorge Karpenkov EXPECT_EQ(checkedMulAddUnsigned<uint64_t>(10, 2, 3), Optional<uint64_t>(23));
81*788087f5SGeorge Karpenkov }
82*788087f5SGeorge Karpenkov
833f547fe8SGeorge Karpenkov
843f547fe8SGeorge Karpenkov } // namespace
85