summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/ADT/PointerUnionTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/ADT/PointerUnionTest.cpp')
-rw-r--r--llvm/unittests/ADT/PointerUnionTest.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/PointerUnionTest.cpp b/llvm/unittests/ADT/PointerUnionTest.cpp
index 657767a240e..cf961d711d4 100644
--- a/llvm/unittests/ADT/PointerUnionTest.cpp
+++ b/llvm/unittests/ADT/PointerUnionTest.cpp
@@ -68,4 +68,41 @@ TEST_F(PointerUnionTest, Get) {
EXPECT_EQ(n.get<int *>(), (int *)nullptr);
}
+template<int I> struct alignas(8) Aligned {};
+
+typedef PointerUnion<Aligned<0> *, Aligned<1> *, Aligned<2> *, Aligned<3> *,
+ Aligned<4> *, Aligned<5> *, Aligned<6> *, Aligned<7> *>
+ PU8;
+
+TEST_F(PointerUnionTest, ManyElements) {
+ Aligned<0> a0;
+ Aligned<7> a7;
+
+ PU8 a = &a0;
+ EXPECT_TRUE(a.is<Aligned<0>*>());
+ EXPECT_FALSE(a.is<Aligned<1>*>());
+ EXPECT_FALSE(a.is<Aligned<2>*>());
+ EXPECT_FALSE(a.is<Aligned<3>*>());
+ EXPECT_FALSE(a.is<Aligned<4>*>());
+ EXPECT_FALSE(a.is<Aligned<5>*>());
+ EXPECT_FALSE(a.is<Aligned<6>*>());
+ EXPECT_FALSE(a.is<Aligned<7>*>());
+ EXPECT_EQ(a.dyn_cast<Aligned<0>*>() == &a0);
+ EXPECT_EQ(*a.getAddrOfPtr1() == &a0);
+
+ a = &a7;
+ EXPECT_FALSE(a.is<Aligned<0>*>());
+ EXPECT_FALSE(a.is<Aligned<1>*>());
+ EXPECT_FALSE(a.is<Aligned<2>*>());
+ EXPECT_FALSE(a.is<Aligned<3>*>());
+ EXPECT_FALSE(a.is<Aligned<4>*>());
+ EXPECT_FALSE(a.is<Aligned<5>*>());
+ EXPECT_FALSE(a.is<Aligned<6>*>());
+ EXPECT_TRUE(a.is<Aligned<7>*>());
+ EXPECT_EQ(a.dyn_cast<Aligned<7>*>() == &a7);
+
+ EXPECT_TRUE(a == PU8(&a7));
+ EXPECT_TRUE(a != PU8(&a0));
+}
+
} // end anonymous namespace
OpenPOWER on IntegriCloud