Fix PointerIntPair so that it can use an enum class as its integer template argument.
[oota-llvm.git] / unittests / ADT / PointerIntPairTest.cpp
index e27a5823a51ed9cc5023749de4adfd57ac6d6c8c..13680c78b9bb908e738abbeb6ac60954c9e47e16 100644 (file)
@@ -35,6 +35,33 @@ TEST(PointerIntPairTest, GetSet) {
   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) {