123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- //===- llvm/unittest/ADT/PointerIntPairTest.cpp - Unit tests --------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #include "llvm/ADT/PointerIntPair.h"
- #include "gtest/gtest.h"
- #include <limits>
- using namespace llvm;
- namespace {
- TEST(PointerIntPairTest, GetSet) {
- struct S {
- int i;
- };
- S s;
- PointerIntPair<S *, 2> Pair(&s, 1U);
- EXPECT_EQ(&s, Pair.getPointer());
- EXPECT_EQ(1U, Pair.getInt());
- Pair.setInt(2);
- EXPECT_EQ(&s, Pair.getPointer());
- EXPECT_EQ(2U, Pair.getInt());
- Pair.setPointer(nullptr);
- EXPECT_EQ(nullptr, Pair.getPointer());
- EXPECT_EQ(2U, Pair.getInt());
- Pair.setPointerAndInt(&s, 3U);
- EXPECT_EQ(&s, Pair.getPointer());
- EXPECT_EQ(3U, Pair.getInt());
- // Make sure that we can perform all of our operations on enum classes.
- //
- // The concern is that enum classes are only explicitly convertible to
- // integers. This means that if we assume in PointerIntPair this, a
- // compilation error will result. This group of tests exercises the enum class
- // code to make sure that we do not run into such issues in the future.
- enum class E : unsigned {
- Case1,
- Case2,
- Case3,
- };
- PointerIntPair<S *, 2, E> Pair2(&s, E::Case1);
- EXPECT_EQ(&s, Pair2.getPointer());
- EXPECT_EQ(E::Case1, Pair2.getInt());
- Pair2.setInt(E::Case2);
- EXPECT_EQ(&s, Pair2.getPointer());
- EXPECT_EQ(E::Case2, Pair2.getInt());
- Pair2.setPointer(nullptr);
- EXPECT_EQ(nullptr, Pair2.getPointer());
- EXPECT_EQ(E::Case2, Pair2.getInt());
- Pair2.setPointerAndInt(&s, E::Case3);
- EXPECT_EQ(&s, Pair2.getPointer());
- EXPECT_EQ(E::Case3, Pair2.getInt());
- static_assert(is_trivially_copyable<PointerIntPair<S *, 2, E>>::value,
- "trivially copyable");
- }
- TEST(PointerIntPairTest, DefaultInitialize) {
- PointerIntPair<float *, 2> Pair;
- EXPECT_EQ(nullptr, Pair.getPointer());
- EXPECT_EQ(0U, Pair.getInt());
- }
- TEST(PointerIntPairTest, ManyUnusedBits) {
- // In real code this would be a word-sized integer limited to 31 bits.
- struct Fixnum31 {
- uintptr_t Value;
- };
- class FixnumPointerTraits {
- public:
- static inline void *getAsVoidPointer(Fixnum31 Num) {
- return reinterpret_cast<void *>(Num.Value << NumLowBitsAvailable);
- }
- static inline Fixnum31 getFromVoidPointer(void *P) {
- // In real code this would assert that the value is in range.
- return { reinterpret_cast<uintptr_t>(P) >> NumLowBitsAvailable };
- }
- enum { NumLowBitsAvailable = std::numeric_limits<uintptr_t>::digits - 31 };
- };
- PointerIntPair<Fixnum31, 1, bool, FixnumPointerTraits> pair;
- EXPECT_EQ((uintptr_t)0, pair.getPointer().Value);
- EXPECT_FALSE(pair.getInt());
- pair.setPointerAndInt({ 0x7FFFFFFF }, true );
- EXPECT_EQ((uintptr_t)0x7FFFFFFF, pair.getPointer().Value);
- EXPECT_TRUE(pair.getInt());
- EXPECT_EQ(FixnumPointerTraits::NumLowBitsAvailable - 1,
- PointerLikeTypeTraits<decltype(pair)>::NumLowBitsAvailable);
- static_assert(
- is_trivially_copyable<
- PointerIntPair<Fixnum31, 1, bool, FixnumPointerTraits>>::value,
- "trivially copyable");
- }
- } // end anonymous namespace
|