From 01a2cb55f1ea6b04cb6f5b514d302179ce9fe811 Mon Sep 17 00:00:00 2001 From: Hubert Tong Date: Sat, 30 Jul 2016 14:01:00 +0000 Subject: TrailingObjects::FixedSizeStorage constexpr fixes + tests Summary: This change fixes issues with `LLVM_CONSTEXPR` functions and `TrailingObjects::FixedSizeStorage`. In particular, some of the functions marked `LLVM_CONSTEXPR` used by `FixedSizeStorage` were not implemented such that they evaluate successfully as part of a constant expression despite constant arguments. This change also implements a more traditional template-meta path to accommodate MSVC, and adds unit tests for `FixedSizeStorage`. Drive-by fix: the access control for members of `TrailingObjectsImpl` is tightened. Reviewers: faisalv, rsmith, aaron.ballman Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D22668 llvm-svn: 277270 --- llvm/unittests/Support/TrailingObjectsTest.cpp | 47 ++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'llvm/unittests/Support/TrailingObjectsTest.cpp') diff --git a/llvm/unittests/Support/TrailingObjectsTest.cpp b/llvm/unittests/Support/TrailingObjectsTest.cpp index a1d3e7b3c86..65fdcb93623 100644 --- a/llvm/unittests/Support/TrailingObjectsTest.cpp +++ b/llvm/unittests/Support/TrailingObjectsTest.cpp @@ -41,6 +41,9 @@ public: unsigned numShorts() const { return NumShorts; } // Pull some protected members in as public, for testability. + template + using FixedSizeStorage = TrailingObjects::FixedSizeStorage; + using TrailingObjects::totalSizeToAlloc; using TrailingObjects::additionalSizeToAlloc; using TrailingObjects::getTrailingObjects; @@ -94,6 +97,9 @@ public: } // Pull some protected members in as public, for testability. + template + using FixedSizeStorage = TrailingObjects::FixedSizeStorage; + using TrailingObjects::totalSizeToAlloc; using TrailingObjects::additionalSizeToAlloc; using TrailingObjects::getTrailingObjects; @@ -106,7 +112,20 @@ TEST(TrailingObjects, OneArg) { EXPECT_EQ(Class1::additionalSizeToAlloc(1), sizeof(short)); EXPECT_EQ(Class1::additionalSizeToAlloc(3), sizeof(short) * 3); + EXPECT_EQ( + llvm::alignOf(), + llvm::alignOf::with_counts<1>::type>()); + EXPECT_EQ(sizeof(Class1::FixedSizeStorage::with_counts<1>::type), + llvm::alignTo(Class1::totalSizeToAlloc(1), + llvm::alignOf())); EXPECT_EQ(Class1::totalSizeToAlloc(1), sizeof(Class1) + sizeof(short)); + + EXPECT_EQ( + llvm::alignOf(), + llvm::alignOf::with_counts<3>::type>()); + EXPECT_EQ(sizeof(Class1::FixedSizeStorage::with_counts<3>::type), + llvm::alignTo(Class1::totalSizeToAlloc(3), + llvm::alignOf())); EXPECT_EQ(Class1::totalSizeToAlloc(3), sizeof(Class1) + sizeof(short) * 3); @@ -131,6 +150,14 @@ TEST(TrailingObjects, TwoArg) { EXPECT_EQ((Class2::additionalSizeToAlloc(3, 1)), sizeof(double) * 3 + sizeof(short)); + EXPECT_EQ( + llvm::alignOf(), + (llvm::alignOf< + Class2::FixedSizeStorage::with_counts<1, 1>::type>())); + EXPECT_EQ( + sizeof(Class2::FixedSizeStorage::with_counts<1, 1>::type), + llvm::alignTo(Class2::totalSizeToAlloc(1, 1), + llvm::alignOf())); EXPECT_EQ((Class2::totalSizeToAlloc(1, 1)), sizeof(Class2) + sizeof(double) + sizeof(short)); @@ -165,6 +192,16 @@ TEST(TrailingObjects, ThreeArg) { EXPECT_EQ((Class3::additionalSizeToAlloc(1, 1, 3)), sizeof(double) + sizeof(short) + 3 * sizeof(bool)); EXPECT_EQ(sizeof(Class3), llvm::alignTo(1, llvm::alignOf())); + + EXPECT_EQ(llvm::alignOf(), + (llvm::alignOf::with_counts<1, 1, 3>::type>())); + EXPECT_EQ( + sizeof(Class3::FixedSizeStorage::with_counts<1, 1, 3>::type), + llvm::alignTo(Class3::totalSizeToAlloc(1, 1, 3), + llvm::alignOf())); + std::unique_ptr P(new char[1000]); Class3 *C = reinterpret_cast(P.get()); EXPECT_EQ(C->getTrailingObjects(), reinterpret_cast(C + 1)); @@ -186,6 +223,16 @@ TEST(TrailingObjects, Realignment) { EXPECT_EQ((Class4::additionalSizeToAlloc(1, 1)), llvm::alignTo(sizeof(long) + 1, llvm::alignOf())); EXPECT_EQ(sizeof(Class4), llvm::alignTo(1, llvm::alignOf())); + + EXPECT_EQ( + llvm::alignOf(), + (llvm::alignOf< + Class4::FixedSizeStorage::with_counts<1, 1>::type>())); + EXPECT_EQ( + sizeof(Class4::FixedSizeStorage::with_counts<1, 1>::type), + llvm::alignTo(Class4::totalSizeToAlloc(1, 1), + llvm::alignOf())); + std::unique_ptr P(new char[1000]); Class4 *C = reinterpret_cast(P.get()); EXPECT_EQ(C->getTrailingObjects(), reinterpret_cast(C + 1)); -- cgit v1.2.3