diff options
Diffstat (limited to 'llvm/unittests/ADT/PointerUnionTest.cpp')
| -rw-r--r-- | llvm/unittests/ADT/PointerUnionTest.cpp | 37 |
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 |

