diff options
author | Serge Guelton <sguelton@quarkslab.com> | 2019-01-20 21:19:56 +0000 |
---|---|---|
committer | Serge Guelton <sguelton@quarkslab.com> | 2019-01-20 21:19:56 +0000 |
commit | be88539b85204041f727ec6499315884b3d886b0 (patch) | |
tree | c6fcb530c4555e3ea4efa1bbbeced22ed7572a57 /llvm/unittests/ADT/PointerIntPairTest.cpp | |
parent | 7ac79ed8f0b50640e2809b9f230f87f1b68baa53 (diff) | |
download | bcm5719-llvm-be88539b85204041f727ec6499315884b3d886b0.tar.gz bcm5719-llvm-be88539b85204041f727ec6499315884b3d886b0.zip |
Replace llvm::isPodLike<...> by llvm::is_trivially_copyable<...>
As noted in https://bugs.llvm.org/show_bug.cgi?id=36651, the specialization for
isPodLike<std::pair<...>> did not match the expectation of
std::is_trivially_copyable which makes the memcpy optimization invalid.
This patch renames the llvm::isPodLike trait into llvm::is_trivially_copyable.
Unfortunately std::is_trivially_copyable is not portable across compiler / STL
versions. So a portable version is provided too.
Note that the following specialization were invalid:
std::pair<T0, T1>
llvm::Optional<T>
Tests have been added to assert that former specialization are respected by the
standard usage of llvm::is_trivially_copyable, and that when a decent version
of std::is_trivially_copyable is available, llvm::is_trivially_copyable is
compared to std::is_trivially_copyable.
As of this patch, llvm::Optional is no longer considered trivially copyable,
even if T is. This is to be fixed in a later patch, as it has impact on a
long-running bug (see r347004)
Note that GCC warns about this UB, but this got silented by https://reviews.llvm.org/D50296.
Differential Revision: https://reviews.llvm.org/D54472
llvm-svn: 351701
Diffstat (limited to 'llvm/unittests/ADT/PointerIntPairTest.cpp')
-rw-r--r-- | llvm/unittests/ADT/PointerIntPairTest.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/PointerIntPairTest.cpp b/llvm/unittests/ADT/PointerIntPairTest.cpp index 95e280330a7..6b3a4c055c9 100644 --- a/llvm/unittests/ADT/PointerIntPairTest.cpp +++ b/llvm/unittests/ADT/PointerIntPairTest.cpp @@ -61,6 +61,9 @@ TEST(PointerIntPairTest, GetSet) { Pair2.setPointerAndInt(&s, E::Case3); EXPECT_EQ(&s, Pair2.getPointer()); EXPECT_EQ(E::Case3, Pair2.getInt()); + + static_assert(is_trivially_copyable<PointerIntPair<S *, 2, E>>::value, + "trivially copyable"); } TEST(PointerIntPairTest, DefaultInitialize) { @@ -96,6 +99,11 @@ TEST(PointerIntPairTest, ManyUnusedBits) { EXPECT_EQ(FixnumPointerTraits::NumLowBitsAvailable - 1, PointerLikeTypeTraits<decltype(pair)>::NumLowBitsAvailable); + + static_assert( + is_trivially_copyable< + PointerIntPair<Fixnum31, 1, bool, FixnumPointerTraits>>::value, + "trivially copyable"); } } // end anonymous namespace |