Index: include/llvm/ADT/PointerSumType.h =================================================================== --- include/llvm/ADT/PointerSumType.h +++ include/llvm/ADT/PointerSumType.h @@ -249,11 +249,11 @@ // member. template struct Checker : Checker { - static_assert(MemberT::Tag < (1 << NumTagBits), + static_assert(MemberT::Tag < (UINTMAX_C(1) << NumTagBits), "This discriminant value requires too many bits!"); }; template struct Checker : std::true_type { - static_assert(MemberT::Tag < (1 << NumTagBits), + static_assert(MemberT::Tag < (UINTMAX_C(1) << NumTagBits), "This discriminant value requires too many bits!"); }; static_assert(Checker::value, Index: unittests/ADT/PointerSumTypeTest.cpp =================================================================== --- unittests/ADT/PointerSumTypeTest.cpp +++ unittests/ADT/PointerSumTypeTest.cpp @@ -7,6 +7,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/ADT/PointerEmbeddedInt.h" #include "llvm/ADT/PointerSumType.h" #include "gtest/gtest.h" using namespace llvm; @@ -18,15 +19,29 @@ float f; int i1, i2; + enum NarrowKinds { EmbeddedInt1, EmbeddedChar }; + unsigned ei1; + char ec; + typedef PointerSumType, PointerSumTypeMember, PointerSumTypeMember> SumType; SumType a, b, c, n; + typedef PointerSumType< + NarrowKinds, + PointerSumTypeMember>, + PointerSumTypeMember>> + NarrowSumType; + NarrowSumType d, e; + PointerSumTypeTest() - : f(3.14f), i1(42), i2(-1), a(SumType::create(&f)), - b(SumType::create(&i1)), c(SumType::create(&i2)), n() {} + : f(3.14f), i1(42), i2(-1), ei1(1), ec('c'), + a(SumType::create(&f)), b(SumType::create(&i1)), + c(SumType::create(&i2)), n(), + d(NarrowSumType::create(ei1)), + e(NarrowSumType::create(ec)) {} }; TEST_F(PointerSumTypeTest, NullTest) { @@ -34,6 +49,8 @@ EXPECT_TRUE(b); EXPECT_TRUE(c); EXPECT_FALSE(n); + EXPECT_TRUE(d); + EXPECT_TRUE(e); } TEST_F(PointerSumTypeTest, GetTag) { @@ -41,6 +58,8 @@ EXPECT_EQ(Int1, b.getTag()); EXPECT_EQ(Int2, c.getTag()); EXPECT_EQ((Kinds)0, n.getTag()); + EXPECT_EQ(EmbeddedInt1, d.getTag()); + EXPECT_EQ(EmbeddedChar, e.getTag()); } TEST_F(PointerSumTypeTest, Is) { @@ -53,6 +72,10 @@ EXPECT_FALSE(c.is()); EXPECT_FALSE(c.is()); EXPECT_TRUE(c.is()); + EXPECT_TRUE(d.is()); + EXPECT_FALSE(d.is()); + EXPECT_FALSE(e.is()); + EXPECT_TRUE(e.is()); } TEST_F(PointerSumTypeTest, Get) { @@ -71,12 +94,19 @@ EXPECT_EQ(nullptr, n.get()); EXPECT_EQ(nullptr, n.get()); EXPECT_EQ(nullptr, n.get()); + + EXPECT_EQ(ei1, d.get()); + EXPECT_EQ('\0', d.get()); + EXPECT_EQ(0U, e.get()); + EXPECT_EQ(ec, e.get()); } TEST_F(PointerSumTypeTest, Cast) { EXPECT_EQ(&f, a.cast()); EXPECT_EQ(&i1, b.cast()); EXPECT_EQ(&i2, c.cast()); + EXPECT_EQ(ei1, d.cast()); + EXPECT_EQ(ec, e.cast()); } TEST_F(PointerSumTypeTest, Assignment) { @@ -107,6 +137,10 @@ EXPECT_EQ(nullptr, n.get()); EXPECT_EQ(nullptr, n.get()); EXPECT_EQ(nullptr, n.get()); + + d = NarrowSumType::create('d'); + EXPECT_EQ(0U, d.get()); + EXPECT_EQ('d', d.get()); }