[PATCH] D16131: Fix PointerIntPair so that it can use an enum class as its integer template argument.
Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 12 22:03:07 PST 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL257574: Fix PointerIntPair so that it can use an enum class as its integer template… (authored by mgottesman).
Changed prior to commit:
http://reviews.llvm.org/D16131?vs=44708&id=44709#toc
Repository:
rL LLVM
http://reviews.llvm.org/D16131
Files:
llvm/trunk/include/llvm/ADT/PointerIntPair.h
llvm/trunk/unittests/ADT/PointerIntPairTest.cpp
Index: llvm/trunk/unittests/ADT/PointerIntPairTest.cpp
===================================================================
--- llvm/trunk/unittests/ADT/PointerIntPairTest.cpp
+++ llvm/trunk/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<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());
}
TEST(PointerIntPairTest, DefaultInitialize) {
Index: llvm/trunk/include/llvm/ADT/PointerIntPair.h
===================================================================
--- llvm/trunk/include/llvm/ADT/PointerIntPair.h
+++ llvm/trunk/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(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<intptr_t>(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<intptr_t>(IntVal));
}
PointerTy const *getAddrOfPointer() const {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16131.44709.patch
Type: text/x-patch
Size: 2464 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160113/9bb07bca/attachment.bin>
More information about the llvm-commits
mailing list