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