APSIntTest.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. //===- llvm/unittest/ADT/APSIntTest.cpp - APSInt unit tests ---------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/ADT/APSInt.h"
  10. #include "gtest/gtest.h"
  11. using namespace llvm;
  12. namespace {
  13. TEST(APSIntTest, MoveTest) {
  14. APSInt A(32, true);
  15. EXPECT_TRUE(A.isUnsigned());
  16. APSInt B(128, false);
  17. A = B;
  18. EXPECT_FALSE(A.isUnsigned());
  19. APSInt C(B);
  20. EXPECT_FALSE(C.isUnsigned());
  21. APInt Wide(256, 0);
  22. const uint64_t *Bits = Wide.getRawData();
  23. APSInt D(std::move(Wide));
  24. EXPECT_TRUE(D.isUnsigned());
  25. EXPECT_EQ(Bits, D.getRawData()); // Verify that "Wide" was really moved.
  26. A = APSInt(64, true);
  27. EXPECT_TRUE(A.isUnsigned());
  28. Wide = APInt(128, 1);
  29. Bits = Wide.getRawData();
  30. A = std::move(Wide);
  31. EXPECT_TRUE(A.isUnsigned());
  32. EXPECT_EQ(Bits, A.getRawData()); // Verify that "Wide" was really moved.
  33. }
  34. TEST(APSIntTest, get) {
  35. EXPECT_TRUE(APSInt::get(7).isSigned());
  36. EXPECT_EQ(64u, APSInt::get(7).getBitWidth());
  37. EXPECT_EQ(7u, APSInt::get(7).getZExtValue());
  38. EXPECT_EQ(7, APSInt::get(7).getSExtValue());
  39. EXPECT_TRUE(APSInt::get(-7).isSigned());
  40. EXPECT_EQ(64u, APSInt::get(-7).getBitWidth());
  41. EXPECT_EQ(-7, APSInt::get(-7).getSExtValue());
  42. EXPECT_EQ(UINT64_C(0) - 7, APSInt::get(-7).getZExtValue());
  43. }
  44. TEST(APSIntTest, getUnsigned) {
  45. EXPECT_TRUE(APSInt::getUnsigned(7).isUnsigned());
  46. EXPECT_EQ(64u, APSInt::getUnsigned(7).getBitWidth());
  47. EXPECT_EQ(7u, APSInt::getUnsigned(7).getZExtValue());
  48. EXPECT_EQ(7, APSInt::getUnsigned(7).getSExtValue());
  49. EXPECT_TRUE(APSInt::getUnsigned(-7).isUnsigned());
  50. EXPECT_EQ(64u, APSInt::getUnsigned(-7).getBitWidth());
  51. EXPECT_EQ(-7, APSInt::getUnsigned(-7).getSExtValue());
  52. EXPECT_EQ(UINT64_C(0) - 7, APSInt::getUnsigned(-7).getZExtValue());
  53. }
  54. TEST(APSIntTest, getExtValue) {
  55. EXPECT_TRUE(APSInt(APInt(3, 7), true).isUnsigned());
  56. EXPECT_TRUE(APSInt(APInt(3, 7), false).isSigned());
  57. EXPECT_TRUE(APSInt(APInt(4, 7), true).isUnsigned());
  58. EXPECT_TRUE(APSInt(APInt(4, 7), false).isSigned());
  59. EXPECT_TRUE(APSInt(APInt(4, -7), true).isUnsigned());
  60. EXPECT_TRUE(APSInt(APInt(4, -7), false).isSigned());
  61. EXPECT_EQ(7, APSInt(APInt(3, 7), true).getExtValue());
  62. EXPECT_EQ(-1, APSInt(APInt(3, 7), false).getExtValue());
  63. EXPECT_EQ(7, APSInt(APInt(4, 7), true).getExtValue());
  64. EXPECT_EQ(7, APSInt(APInt(4, 7), false).getExtValue());
  65. EXPECT_EQ(9, APSInt(APInt(4, -7), true).getExtValue());
  66. EXPECT_EQ(-7, APSInt(APInt(4, -7), false).getExtValue());
  67. }
  68. TEST(APSIntTest, compareValues) {
  69. auto U = [](uint64_t V) { return APSInt::getUnsigned(V); };
  70. auto S = [](int64_t V) { return APSInt::get(V); };
  71. // Bit-width matches and is-signed.
  72. EXPECT_TRUE(APSInt::compareValues(S(7), S(8)) < 0);
  73. EXPECT_TRUE(APSInt::compareValues(S(8), S(7)) > 0);
  74. EXPECT_TRUE(APSInt::compareValues(S(7), S(7)) == 0);
  75. EXPECT_TRUE(APSInt::compareValues(S(-7), S(8)) < 0);
  76. EXPECT_TRUE(APSInt::compareValues(S(8), S(-7)) > 0);
  77. EXPECT_TRUE(APSInt::compareValues(S(-7), S(-7)) == 0);
  78. EXPECT_TRUE(APSInt::compareValues(S(-7), S(-8)) > 0);
  79. EXPECT_TRUE(APSInt::compareValues(S(-8), S(-7)) < 0);
  80. EXPECT_TRUE(APSInt::compareValues(S(-7), S(-7)) == 0);
  81. // Bit-width matches and not is-signed.
  82. EXPECT_TRUE(APSInt::compareValues(U(7), U(8)) < 0);
  83. EXPECT_TRUE(APSInt::compareValues(U(8), U(7)) > 0);
  84. EXPECT_TRUE(APSInt::compareValues(U(7), U(7)) == 0);
  85. // Bit-width matches and mixed signs.
  86. EXPECT_TRUE(APSInt::compareValues(U(7), S(8)) < 0);
  87. EXPECT_TRUE(APSInt::compareValues(U(8), S(7)) > 0);
  88. EXPECT_TRUE(APSInt::compareValues(U(7), S(7)) == 0);
  89. EXPECT_TRUE(APSInt::compareValues(U(8), S(-7)) > 0);
  90. // Bit-width mismatch and is-signed.
  91. EXPECT_TRUE(APSInt::compareValues(S(7).trunc(32), S(8)) < 0);
  92. EXPECT_TRUE(APSInt::compareValues(S(8).trunc(32), S(7)) > 0);
  93. EXPECT_TRUE(APSInt::compareValues(S(7).trunc(32), S(7)) == 0);
  94. EXPECT_TRUE(APSInt::compareValues(S(-7).trunc(32), S(8)) < 0);
  95. EXPECT_TRUE(APSInt::compareValues(S(8).trunc(32), S(-7)) > 0);
  96. EXPECT_TRUE(APSInt::compareValues(S(-7).trunc(32), S(-7)) == 0);
  97. EXPECT_TRUE(APSInt::compareValues(S(-7).trunc(32), S(-8)) > 0);
  98. EXPECT_TRUE(APSInt::compareValues(S(-8).trunc(32), S(-7)) < 0);
  99. EXPECT_TRUE(APSInt::compareValues(S(-7).trunc(32), S(-7)) == 0);
  100. EXPECT_TRUE(APSInt::compareValues(S(7), S(8).trunc(32)) < 0);
  101. EXPECT_TRUE(APSInt::compareValues(S(8), S(7).trunc(32)) > 0);
  102. EXPECT_TRUE(APSInt::compareValues(S(7), S(7).trunc(32)) == 0);
  103. EXPECT_TRUE(APSInt::compareValues(S(-7), S(8).trunc(32)) < 0);
  104. EXPECT_TRUE(APSInt::compareValues(S(8), S(-7).trunc(32)) > 0);
  105. EXPECT_TRUE(APSInt::compareValues(S(-7), S(-7).trunc(32)) == 0);
  106. EXPECT_TRUE(APSInt::compareValues(S(-7), S(-8).trunc(32)) > 0);
  107. EXPECT_TRUE(APSInt::compareValues(S(-8), S(-7).trunc(32)) < 0);
  108. EXPECT_TRUE(APSInt::compareValues(S(-7), S(-7).trunc(32)) == 0);
  109. // Bit-width mismatch and not is-signed.
  110. EXPECT_TRUE(APSInt::compareValues(U(7), U(8).trunc(32)) < 0);
  111. EXPECT_TRUE(APSInt::compareValues(U(8), U(7).trunc(32)) > 0);
  112. EXPECT_TRUE(APSInt::compareValues(U(7), U(7).trunc(32)) == 0);
  113. EXPECT_TRUE(APSInt::compareValues(U(7).trunc(32), U(8)) < 0);
  114. EXPECT_TRUE(APSInt::compareValues(U(8).trunc(32), U(7)) > 0);
  115. EXPECT_TRUE(APSInt::compareValues(U(7).trunc(32), U(7)) == 0);
  116. // Bit-width mismatch and mixed signs.
  117. EXPECT_TRUE(APSInt::compareValues(U(7).trunc(32), S(8)) < 0);
  118. EXPECT_TRUE(APSInt::compareValues(U(8).trunc(32), S(7)) > 0);
  119. EXPECT_TRUE(APSInt::compareValues(U(7).trunc(32), S(7)) == 0);
  120. EXPECT_TRUE(APSInt::compareValues(U(8).trunc(32), S(-7)) > 0);
  121. EXPECT_TRUE(APSInt::compareValues(U(7), S(8).trunc(32)) < 0);
  122. EXPECT_TRUE(APSInt::compareValues(U(8), S(7).trunc(32)) > 0);
  123. EXPECT_TRUE(APSInt::compareValues(U(7), S(7).trunc(32)) == 0);
  124. EXPECT_TRUE(APSInt::compareValues(U(8), S(-7).trunc(32)) > 0);
  125. }
  126. TEST(APSIntTest, FromString) {
  127. EXPECT_EQ(APSInt("1").getExtValue(), 1);
  128. EXPECT_EQ(APSInt("-1").getExtValue(), -1);
  129. EXPECT_EQ(APSInt("0").getExtValue(), 0);
  130. EXPECT_EQ(APSInt("56789").getExtValue(), 56789);
  131. EXPECT_EQ(APSInt("-1234").getExtValue(), -1234);
  132. }
  133. #if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG)
  134. TEST(APSIntTest, StringDeath) {
  135. EXPECT_DEATH(APSInt(""), "Invalid string length");
  136. EXPECT_DEATH(APSInt("1a"), "Invalid character in digit string");
  137. }
  138. #endif
  139. } // end anonymous namespace