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