Index: include/llvm/ADT/PointerIntPair.h =================================================================== --- include/llvm/ADT/PointerIntPair.h +++ include/llvm/ADT/PointerIntPair.h @@ -55,20 +55,25 @@ PointerTy getPointer() const { return Info::getPointer(Value); } - IntType getInt() const { return (IntType)Info::getInt(Value); } + IntType getInt() const { + return (IntType)Info::getInt(static_cast(Value)); + } void setPointer(PointerTy PtrVal) { Value = Info::updatePointer(Value, PtrVal); } - void setInt(IntType IntVal) { Value = Info::updateInt(Value, IntVal); } + void setInt(IntType IntVal) { + Value = Info::updateInt(Value, static_cast(IntVal)); + } void initWithPointer(PointerTy PtrVal) { Value = Info::updatePointer(0, PtrVal); } void setPointerAndInt(PointerTy PtrVal, IntType IntVal) { - Value = Info::updateInt(Info::updatePointer(0, PtrVal), IntVal); + Value = Info::updateInt(Info::updatePointer(0, PtrVal), + static_cast(IntVal)); } PointerTy const *getAddrOfPointer() const { Index: unittests/ADT/PointerIntPairTest.cpp =================================================================== --- unittests/ADT/PointerIntPairTest.cpp +++ unittests/ADT/PointerIntPairTest.cpp @@ -35,6 +35,33 @@ 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 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()); } TEST(PointerIntPairTest, DefaultInitialize) {