diff options
author | Hubert Tong <hubert.reinterpretcast@gmail.com> | 2016-07-30 14:01:00 +0000 |
---|---|---|
committer | Hubert Tong <hubert.reinterpretcast@gmail.com> | 2016-07-30 14:01:00 +0000 |
commit | 01a2cb55f1ea6b04cb6f5b514d302179ce9fe811 (patch) | |
tree | 4874336a9e53ac17bdb52a572d9a536ed1886194 /llvm/unittests/Support/TrailingObjectsTest.cpp | |
parent | a216643cd31c808a36d0c79c7f96dabc6eb6c8b7 (diff) | |
download | bcm5719-llvm-01a2cb55f1ea6b04cb6f5b514d302179ce9fe811.tar.gz bcm5719-llvm-01a2cb55f1ea6b04cb6f5b514d302179ce9fe811.zip |
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
Diffstat (limited to 'llvm/unittests/Support/TrailingObjectsTest.cpp')
-rw-r--r-- | llvm/unittests/Support/TrailingObjectsTest.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
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 <typename... Ty> + using FixedSizeStorage = TrailingObjects::FixedSizeStorage<Ty...>; + using TrailingObjects::totalSizeToAlloc; using TrailingObjects::additionalSizeToAlloc; using TrailingObjects::getTrailingObjects; @@ -94,6 +97,9 @@ public: } // Pull some protected members in as public, for testability. + template <typename... Ty> + using FixedSizeStorage = TrailingObjects::FixedSizeStorage<Ty...>; + using TrailingObjects::totalSizeToAlloc; using TrailingObjects::additionalSizeToAlloc; using TrailingObjects::getTrailingObjects; @@ -106,7 +112,20 @@ TEST(TrailingObjects, OneArg) { EXPECT_EQ(Class1::additionalSizeToAlloc<short>(1), sizeof(short)); EXPECT_EQ(Class1::additionalSizeToAlloc<short>(3), sizeof(short) * 3); + EXPECT_EQ( + llvm::alignOf<Class1>(), + llvm::alignOf<Class1::FixedSizeStorage<short>::with_counts<1>::type>()); + EXPECT_EQ(sizeof(Class1::FixedSizeStorage<short>::with_counts<1>::type), + llvm::alignTo(Class1::totalSizeToAlloc<short>(1), + llvm::alignOf<Class1>())); EXPECT_EQ(Class1::totalSizeToAlloc<short>(1), sizeof(Class1) + sizeof(short)); + + EXPECT_EQ( + llvm::alignOf<Class1>(), + llvm::alignOf<Class1::FixedSizeStorage<short>::with_counts<3>::type>()); + EXPECT_EQ(sizeof(Class1::FixedSizeStorage<short>::with_counts<3>::type), + llvm::alignTo(Class1::totalSizeToAlloc<short>(3), + llvm::alignOf<Class1>())); EXPECT_EQ(Class1::totalSizeToAlloc<short>(3), sizeof(Class1) + sizeof(short) * 3); @@ -131,6 +150,14 @@ TEST(TrailingObjects, TwoArg) { EXPECT_EQ((Class2::additionalSizeToAlloc<double, short>(3, 1)), sizeof(double) * 3 + sizeof(short)); + EXPECT_EQ( + llvm::alignOf<Class2>(), + (llvm::alignOf< + Class2::FixedSizeStorage<double, short>::with_counts<1, 1>::type>())); + EXPECT_EQ( + sizeof(Class2::FixedSizeStorage<double, short>::with_counts<1, 1>::type), + llvm::alignTo(Class2::totalSizeToAlloc<double, short>(1, 1), + llvm::alignOf<Class2>())); EXPECT_EQ((Class2::totalSizeToAlloc<double, short>(1, 1)), sizeof(Class2) + sizeof(double) + sizeof(short)); @@ -165,6 +192,16 @@ TEST(TrailingObjects, ThreeArg) { EXPECT_EQ((Class3::additionalSizeToAlloc<double, short, bool>(1, 1, 3)), sizeof(double) + sizeof(short) + 3 * sizeof(bool)); EXPECT_EQ(sizeof(Class3), llvm::alignTo(1, llvm::alignOf<double>())); + + EXPECT_EQ(llvm::alignOf<Class3>(), + (llvm::alignOf<Class3::FixedSizeStorage< + double, short, bool>::with_counts<1, 1, 3>::type>())); + EXPECT_EQ( + sizeof(Class3::FixedSizeStorage<double, short, + bool>::with_counts<1, 1, 3>::type), + llvm::alignTo(Class3::totalSizeToAlloc<double, short, bool>(1, 1, 3), + llvm::alignOf<Class3>())); + std::unique_ptr<char[]> P(new char[1000]); Class3 *C = reinterpret_cast<Class3 *>(P.get()); EXPECT_EQ(C->getTrailingObjects<double>(), reinterpret_cast<double *>(C + 1)); @@ -186,6 +223,16 @@ TEST(TrailingObjects, Realignment) { EXPECT_EQ((Class4::additionalSizeToAlloc<char, long>(1, 1)), llvm::alignTo(sizeof(long) + 1, llvm::alignOf<long>())); EXPECT_EQ(sizeof(Class4), llvm::alignTo(1, llvm::alignOf<long>())); + + EXPECT_EQ( + llvm::alignOf<Class4>(), + (llvm::alignOf< + Class4::FixedSizeStorage<char, long>::with_counts<1, 1>::type>())); + EXPECT_EQ( + sizeof(Class4::FixedSizeStorage<char, long>::with_counts<1, 1>::type), + llvm::alignTo(Class4::totalSizeToAlloc<char, long>(1, 1), + llvm::alignOf<Class4>())); + std::unique_ptr<char[]> P(new char[1000]); Class4 *C = reinterpret_cast<Class4 *>(P.get()); EXPECT_EQ(C->getTrailingObjects<char>(), reinterpret_cast<char *>(C + 1)); |