[PATCH] D16131: Fix PointerIntPair so that it can use an enum class as its integer template argument.
Michael Gottesman via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 12 21:51:54 PST 2016
gottesmm updated this revision to Diff 44708.
gottesmm added a comment.
Removed an unneeded static cast.
http://reviews.llvm.org/D16131
Files:
include/llvm/ADT/PointerIntPair.h
unittests/ADT/PointerIntPairTest.cpp
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<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: 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(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.44708.patch
Type: text/x-patch
Size: 2398 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160113/67dda156/attachment.bin>
More information about the llvm-commits
mailing list