CheckedArithmeticTest.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "llvm/Support/CheckedArithmetic.h"
  2. #include "gtest/gtest.h"
  3. using namespace llvm;
  4. namespace {
  5. TEST(CheckedArithmetic, CheckedAdd) {
  6. int64_t Out;
  7. const int64_t Max = std::numeric_limits<int64_t>::max();
  8. const int64_t Min = std::numeric_limits<int64_t>::min();
  9. EXPECT_EQ(checkedAdd<int64_t>(Max, Max, &Out), true);
  10. EXPECT_EQ(checkedAdd<int64_t>(Min, -1, &Out), true);
  11. EXPECT_EQ(checkedAdd<int64_t>(Max, 1, &Out), true);
  12. EXPECT_EQ(checkedAdd<int64_t>(10, 1, &Out), false);
  13. EXPECT_EQ(Out, 11);
  14. }
  15. TEST(CheckedArithmetic, CheckedAddSmall) {
  16. int16_t Out;
  17. const int16_t Max = std::numeric_limits<int16_t>::max();
  18. const int16_t Min = std::numeric_limits<int16_t>::min();
  19. EXPECT_EQ(checkedAdd<int16_t>(Max, Max, &Out), true);
  20. EXPECT_EQ(checkedAdd<int16_t>(Min, -1, &Out), true);
  21. EXPECT_EQ(checkedAdd<int16_t>(Max, 1, &Out), true);
  22. EXPECT_EQ(checkedAdd<int16_t>(10, 1, &Out), false);
  23. EXPECT_EQ(Out, 11);
  24. }
  25. TEST(CheckedArithmetic, CheckedMul) {
  26. int64_t Out;
  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, &Out), true);
  30. EXPECT_EQ(checkedMul<int64_t>(Max, Max, &Out), true);
  31. EXPECT_EQ(checkedMul<int64_t>(Min, 2, &Out), true);
  32. EXPECT_EQ(checkedMul<int64_t>(10, 2, &Out), false);
  33. EXPECT_EQ(Out, 20);
  34. }
  35. TEST(CheckedArithmetic, CheckedMulSmall) {
  36. int16_t Out;
  37. const int16_t Max = std::numeric_limits<int16_t>::max();
  38. const int16_t Min = std::numeric_limits<int16_t>::min();
  39. EXPECT_EQ(checkedMul<int16_t>(Max, 2, &Out), true);
  40. EXPECT_EQ(checkedMul<int16_t>(Max, Max, &Out), true);
  41. EXPECT_EQ(checkedMul<int16_t>(Min, 2, &Out), true);
  42. EXPECT_EQ(checkedMul<int16_t>(10, 2, &Out), false);
  43. EXPECT_EQ(Out, 20);
  44. }
  45. TEST(CheckedArithmetic, CheckedAddUnsigned) {
  46. uint64_t Out;
  47. const uint64_t Max = std::numeric_limits<uint64_t>::max();
  48. EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, Max, &Out), true);
  49. EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, 1, &Out), true);
  50. EXPECT_EQ(checkedAddUnsigned<uint64_t>(10, 1, &Out), false);
  51. EXPECT_EQ(Out, uint64_t(11));
  52. }
  53. TEST(CheckedArithmetic, CheckedMulUnsigned) {
  54. uint64_t Out;
  55. const uint64_t Max = std::numeric_limits<uint64_t>::max();
  56. EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, 2, &Out), true);
  57. EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, Max, &Out), true);
  58. EXPECT_EQ(checkedMulUnsigned<uint64_t>(10, 2, &Out), false);
  59. EXPECT_EQ(Out, uint64_t(20));
  60. }
  61. } // namespace