summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Support/TrailingObjectsTest.cpp
diff options
context:
space:
mode:
authorHubert Tong <hubert.reinterpretcast@gmail.com>2016-07-30 14:01:00 +0000
committerHubert Tong <hubert.reinterpretcast@gmail.com>2016-07-30 14:01:00 +0000
commit01a2cb55f1ea6b04cb6f5b514d302179ce9fe811 (patch)
tree4874336a9e53ac17bdb52a572d9a536ed1886194 /llvm/unittests/Support/TrailingObjectsTest.cpp
parenta216643cd31c808a36d0c79c7f96dabc6eb6c8b7 (diff)
downloadbcm5719-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.cpp47
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));
OpenPOWER on IntegriCloud