xref: /llvm-project/llvm/unittests/Support/CheckedArithmeticTest.cpp (revision 3f547fe8571c2bb6b3fd10bef6af08da1436bd85)
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