136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===- llvm/unittest/ADT/APSIntTest.cpp - APSInt unit tests ---------------===//
236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//                     The LLVM Compiler Infrastructure
436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source
636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details.
736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/APSInt.h"
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "gtest/gtest.h"
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace llvm;
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace {
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST(APSIntTest, MoveTest) {
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  APSInt A(32, true);
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(A.isUnsigned());
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  APSInt B(128, false);
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  A = B;
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(A.isUnsigned());
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  APSInt C(B);
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(C.isUnsigned());
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  APInt Wide(256, 0);
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const uint64_t *Bits = Wide.getRawData();
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  APSInt D(std::move(Wide));
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(D.isUnsigned());
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(Bits, D.getRawData()); // Verify that "Wide" was really moved.
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  A = APSInt(64, true);
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(A.isUnsigned());
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Wide = APInt(128, 1);
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Bits = Wide.getRawData();
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  A = std::move(Wide);
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(A.isUnsigned());
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(Bits, A.getRawData()); // Verify that "Wide" was really moved.
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
44ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTEST(APSIntTest, get) {
45ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::get(7).isSigned());
46ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(64u, APSInt::get(7).getBitWidth());
47ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(7u, APSInt::get(7).getZExtValue());
48ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(7, APSInt::get(7).getSExtValue());
49ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::get(-7).isSigned());
50ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(64u, APSInt::get(-7).getBitWidth());
51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(-7, APSInt::get(-7).getSExtValue());
52ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(UINT64_C(0) - 7, APSInt::get(-7).getZExtValue());
53ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
54ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
55ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTEST(APSIntTest, getUnsigned) {
56ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::getUnsigned(7).isUnsigned());
57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(64u, APSInt::getUnsigned(7).getBitWidth());
58ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(7u, APSInt::getUnsigned(7).getZExtValue());
59ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(7, APSInt::getUnsigned(7).getSExtValue());
60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::getUnsigned(-7).isUnsigned());
61ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(64u, APSInt::getUnsigned(-7).getBitWidth());
62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(-7, APSInt::getUnsigned(-7).getSExtValue());
63ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(UINT64_C(0) - 7, APSInt::getUnsigned(-7).getZExtValue());
64ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
66ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTEST(APSIntTest, getExtValue) {
67ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt(APInt(3, 7), true).isUnsigned());
68ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt(APInt(3, 7), false).isSigned());
69ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt(APInt(4, 7), true).isUnsigned());
70ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt(APInt(4, 7), false).isSigned());
71ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt(APInt(4, -7), true).isUnsigned());
72ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt(APInt(4, -7), false).isSigned());
73ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(7, APSInt(APInt(3, 7), true).getExtValue());
74ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(-1, APSInt(APInt(3, 7), false).getExtValue());
75ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(7, APSInt(APInt(4, 7), true).getExtValue());
76ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(7, APSInt(APInt(4, 7), false).getExtValue());
77ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(9, APSInt(APInt(4, -7), true).getExtValue());
78ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_EQ(-7, APSInt(APInt(4, -7), false).getExtValue());
79ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
80ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
81ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTEST(APSIntTest, compareValues) {
82ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  auto U = [](uint64_t V) { return APSInt::getUnsigned(V); };
83ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  auto S = [](int64_t V) { return APSInt::get(V); };
84ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
85ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Bit-width matches and is-signed.
86ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(7), S(8)) < 0);
87ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(8), S(7)) > 0);
88ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(7), S(7)) == 0);
89ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-7), S(8)) < 0);
90ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(8), S(-7)) > 0);
91ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-7), S(-7)) == 0);
92ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-7), S(-8)) > 0);
93ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-8), S(-7)) < 0);
94ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-7), S(-7)) == 0);
95ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
96ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Bit-width matches and not is-signed.
97ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(7), U(8)) < 0);
98ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(8), U(7)) > 0);
99ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(7), U(7)) == 0);
100ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
101ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Bit-width matches and mixed signs.
102ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(7), S(8)) < 0);
103ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(8), S(7)) > 0);
104ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(7), S(7)) == 0);
105ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(8), S(-7)) > 0);
106ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
107ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Bit-width mismatch and is-signed.
108ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(7).trunc(32), S(8)) < 0);
109ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(8).trunc(32), S(7)) > 0);
110ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(7).trunc(32), S(7)) == 0);
111ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-7).trunc(32), S(8)) < 0);
112ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(8).trunc(32), S(-7)) > 0);
113ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-7).trunc(32), S(-7)) == 0);
114ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-7).trunc(32), S(-8)) > 0);
115ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-8).trunc(32), S(-7)) < 0);
116ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-7).trunc(32), S(-7)) == 0);
117ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(7), S(8).trunc(32)) < 0);
118ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(8), S(7).trunc(32)) > 0);
119ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(7), S(7).trunc(32)) == 0);
120ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-7), S(8).trunc(32)) < 0);
121ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(8), S(-7).trunc(32)) > 0);
122ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-7), S(-7).trunc(32)) == 0);
123ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-7), S(-8).trunc(32)) > 0);
124ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-8), S(-7).trunc(32)) < 0);
125ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(S(-7), S(-7).trunc(32)) == 0);
126ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
127ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Bit-width mismatch and not is-signed.
128ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(7), U(8).trunc(32)) < 0);
129ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(8), U(7).trunc(32)) > 0);
130ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(7), U(7).trunc(32)) == 0);
131ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(7).trunc(32), U(8)) < 0);
132ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(8).trunc(32), U(7)) > 0);
133ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(7).trunc(32), U(7)) == 0);
134ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
135ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Bit-width mismatch and mixed signs.
136ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(7).trunc(32), S(8)) < 0);
137ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(8).trunc(32), S(7)) > 0);
138ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(7).trunc(32), S(7)) == 0);
139ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(8).trunc(32), S(-7)) > 0);
140ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(7), S(8).trunc(32)) < 0);
141ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(8), S(7).trunc(32)) > 0);
142ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(7), S(7).trunc(32)) == 0);
143ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EXPECT_TRUE(APSInt::compareValues(U(8), S(-7).trunc(32)) > 0);
144ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
145ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
146f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarTEST(APSIntTest, FromString) {
147f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  EXPECT_EQ(APSInt("1").getExtValue(), 1);
148f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  EXPECT_EQ(APSInt("-1").getExtValue(), -1);
149f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  EXPECT_EQ(APSInt("0").getExtValue(), 0);
150f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  EXPECT_EQ(APSInt("56789").getExtValue(), 56789);
151f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  EXPECT_EQ(APSInt("-1234").getExtValue(), -1234);
15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
153f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
154f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG)
155f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
156f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarTEST(APSIntTest, StringDeath) {
157f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  EXPECT_DEATH(APSInt(""), "Invalid string length");
158f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  EXPECT_DEATH(APSInt("1a"), "Invalid character in digit string");
159f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
160f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
161f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#endif
162f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
163f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} // end anonymous namespace
164