From 826f17399be7304fb62b09ac9cd418386f52a5e1 Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Mon, 18 Jul 2016 04:48:37 +0000 Subject: [PATCH] Improve ABI tests for std::pair. llvm-svn: 275757 --- ...cpp => non_trivial_copy_move_ABI.pass.cpp} | 10 +- .../pairs.pair/trivial_copy_move_ABI.pass.cpp | 147 ++++++++++++++++++ 2 files changed, 152 insertions(+), 5 deletions(-) rename libcxx/test/libcxx/utilities/utility/pairs/pairs.pair/{trivial_copy_move.pass.cpp => non_trivial_copy_move_ABI.pass.cpp} (80%) create mode 100644 libcxx/test/libcxx/utilities/utility/pairs/pairs.pair/trivial_copy_move_ABI.pass.cpp diff --git a/libcxx/test/libcxx/utilities/utility/pairs/pairs.pair/trivial_copy_move.pass.cpp b/libcxx/test/libcxx/utilities/utility/pairs/pairs.pair/non_trivial_copy_move_ABI.pass.cpp similarity index 80% rename from libcxx/test/libcxx/utilities/utility/pairs/pairs.pair/trivial_copy_move.pass.cpp rename to libcxx/test/libcxx/utilities/utility/pairs/pairs.pair/non_trivial_copy_move_ABI.pass.cpp index b982375e0f26..c012ac6265e0 100644 --- a/libcxx/test/libcxx/utilities/utility/pairs/pairs.pair/trivial_copy_move.pass.cpp +++ b/libcxx/test/libcxx/utilities/utility/pairs/pairs.pair/non_trivial_copy_move_ABI.pass.cpp @@ -11,9 +11,6 @@ // template struct pair -// Doesn't pass due to use of is_trivially_* trait. -// XFAIL: gcc-4.9 - // Test that we properly provide the old non-trivial copy operations // when the ABI macro is defined. @@ -36,20 +33,23 @@ int main() { static_assert(std::is_copy_constructible

::value, ""); static_assert(!std::is_trivially_copy_constructible

::value, ""); + static_assert(!std::is_trivially_copyable

::value, ""); } #if TEST_STD_VER >= 11 { static_assert(std::is_move_constructible

::value, ""); static_assert(!std::is_trivially_move_constructible

::value, ""); + static_assert(!std::is_trivially_copyable

::value, ""); } { using P1 = std::pair; - // This line fails because the non-trivial constructors do not provide + // These lines fail because the non-trivial constructors do not provide // SFINAE. // static_assert(!std::is_copy_constructible::value, ""); - static_assert(!std::is_trivially_copy_constructible::value, ""); + // static_assert(!std::is_trivially_copy_constructible::value, ""); static_assert(std::is_move_constructible::value, ""); static_assert(!std::is_trivially_move_constructible::value, ""); + static_assert(!std::is_trivially_copyable

::value, ""); } #endif } diff --git a/libcxx/test/libcxx/utilities/utility/pairs/pairs.pair/trivial_copy_move_ABI.pass.cpp b/libcxx/test/libcxx/utilities/utility/pairs/pairs.pair/trivial_copy_move_ABI.pass.cpp new file mode 100644 index 000000000000..ec9cc7ec3e02 --- /dev/null +++ b/libcxx/test/libcxx/utilities/utility/pairs/pairs.pair/trivial_copy_move_ABI.pass.cpp @@ -0,0 +1,147 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// The test fails due to the missing is_trivially_constructible intrinsic. +// XFAIL: gcc-4.9 + +// + +// template struct pair + +// Test that we properly provide the trivial copy operations by default. + +// FreeBSD provides the old ABI. This test checks the new ABI so we need +// to manually turn it on. +#if defined(__FreeBSD__) +#define _LIBCPP_ABI_UNSTABLE +#endif + +#include +#include +#include +#include + +#include "test_macros.h" + +#if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR) +#error Non-trivial ctor ABI macro defined +#endif + +template +struct HasTrivialABI : std::integral_constant::value + && (!std::is_copy_constructible::value || std::is_trivially_copy_constructible::value) +#if TEST_STD_VER >= 11 + && (!std::is_move_constructible::value || std::is_trivially_move_constructible::value) +#endif +> {}; + +#if TEST_STD_VER >= 11 +struct NonTrivialDtor { + NonTrivialDtor(NonTrivialDtor const&) = default; + ~NonTrivialDtor(); +}; +NonTrivialDtor::~NonTrivialDtor() {} +static_assert(!HasTrivialABI::value, ""); + +struct NonTrivialCopy { + NonTrivialCopy(NonTrivialCopy const&); +}; +NonTrivialCopy::NonTrivialCopy(NonTrivialCopy const&) {} +static_assert(!HasTrivialABI::value, ""); + +struct NonTrivialMove { + NonTrivialMove(NonTrivialMove const&) = default; + NonTrivialMove(NonTrivialMove&&); +}; +NonTrivialMove::NonTrivialMove(NonTrivialMove&&) {} +static_assert(!HasTrivialABI::value, ""); + +struct DeletedCopy { + DeletedCopy(DeletedCopy const&) = delete; + DeletedCopy(DeletedCopy&&) = default; +}; +static_assert(HasTrivialABI::value, ""); + +struct TrivialMove { + TrivialMove(TrivialMove &&) = default; +}; +static_assert(HasTrivialABI::value, ""); + +struct Trivial { + Trivial(Trivial const&) = default; +}; +static_assert(HasTrivialABI::value, ""); +#endif + + +int main() +{ + { + typedef std::pair P; + static_assert(std::is_copy_constructible

::value, ""); + static_assert(HasTrivialABI

::value, ""); + } +#if TEST_STD_VER >= 11 + { + typedef std::pair P; + static_assert(std::is_move_constructible

::value, ""); + static_assert(HasTrivialABI

::value, ""); + } + { + using P = std::pair; + static_assert(!std::is_trivially_destructible

::value, ""); + static_assert(std::is_copy_constructible

::value, ""); + static_assert(!std::is_trivially_copy_constructible

::value, ""); + static_assert(std::is_move_constructible

::value, ""); + static_assert(!std::is_trivially_move_constructible

::value, ""); + static_assert(!HasTrivialABI

::value, ""); + } + { + using P = std::pair; + static_assert(std::is_copy_constructible

::value, ""); + static_assert(!std::is_trivially_copy_constructible

::value, ""); + static_assert(std::is_move_constructible

::value, ""); + static_assert(!std::is_trivially_move_constructible

::value, ""); + static_assert(!HasTrivialABI

::value, ""); + } + { + using P = std::pair; + static_assert(std::is_copy_constructible

::value, ""); + static_assert(std::is_trivially_copy_constructible

::value, ""); + static_assert(std::is_move_constructible

::value, ""); + static_assert(!std::is_trivially_move_constructible

::value, ""); + static_assert(!HasTrivialABI

::value, ""); + } + { + using P = std::pair; + static_assert(!std::is_copy_constructible

::value, ""); + static_assert(!std::is_trivially_copy_constructible

::value, ""); + static_assert(std::is_move_constructible

::value, ""); + static_assert(std::is_trivially_move_constructible

::value, ""); + static_assert(HasTrivialABI

::value, ""); + } + { + using P = std::pair; + static_assert(std::is_copy_constructible

::value, ""); + static_assert(std::is_trivially_copy_constructible

::value, ""); + static_assert(std::is_move_constructible

::value, ""); + static_assert(std::is_trivially_move_constructible

::value, ""); + static_assert(HasTrivialABI

::value, ""); + } + { + using P = std::pair; + static_assert(!std::is_copy_constructible

::value, ""); + static_assert(!std::is_trivially_copy_constructible

::value, ""); + static_assert(std::is_move_constructible

::value, ""); + static_assert(std::is_trivially_move_constructible

::value, ""); + static_assert(HasTrivialABI

::value, ""); + } +#endif +} -- GitLab