Skip to content
Snippets Groups Projects
Commit 826f1739 authored by Eric Fiselier's avatar Eric Fiselier
Browse files

Improve ABI tests for std::pair.

llvm-svn: 275757
parent 966bde50
No related branches found
No related tags found
No related merge requests found
...@@ -11,9 +11,6 @@ ...@@ -11,9 +11,6 @@
// template <class T1, class T2> struct pair // template <class T1, class T2> 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 // Test that we properly provide the old non-trivial copy operations
// when the ABI macro is defined. // when the ABI macro is defined.
...@@ -36,20 +33,23 @@ int main() ...@@ -36,20 +33,23 @@ int main()
{ {
static_assert(std::is_copy_constructible<P>::value, ""); static_assert(std::is_copy_constructible<P>::value, "");
static_assert(!std::is_trivially_copy_constructible<P>::value, ""); static_assert(!std::is_trivially_copy_constructible<P>::value, "");
static_assert(!std::is_trivially_copyable<P>::value, "");
} }
#if TEST_STD_VER >= 11 #if TEST_STD_VER >= 11
{ {
static_assert(std::is_move_constructible<P>::value, ""); static_assert(std::is_move_constructible<P>::value, "");
static_assert(!std::is_trivially_move_constructible<P>::value, ""); static_assert(!std::is_trivially_move_constructible<P>::value, "");
static_assert(!std::is_trivially_copyable<P>::value, "");
} }
{ {
using P1 = std::pair<Dummy, int>; using P1 = std::pair<Dummy, int>;
// This line fails because the non-trivial constructors do not provide // These lines fail because the non-trivial constructors do not provide
// SFINAE. // SFINAE.
// static_assert(!std::is_copy_constructible<P1>::value, ""); // static_assert(!std::is_copy_constructible<P1>::value, "");
static_assert(!std::is_trivially_copy_constructible<P1>::value, ""); // static_assert(!std::is_trivially_copy_constructible<P1>::value, "");
static_assert(std::is_move_constructible<P1>::value, ""); static_assert(std::is_move_constructible<P1>::value, "");
static_assert(!std::is_trivially_move_constructible<P1>::value, ""); static_assert(!std::is_trivially_move_constructible<P1>::value, "");
static_assert(!std::is_trivially_copyable<P>::value, "");
} }
#endif #endif
} }
//===----------------------------------------------------------------------===//
//
// 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
// <utility>
// template <class T1, class T2> 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 <utility>
#include <type_traits>
#include <cstdlib>
#include <cassert>
#include "test_macros.h"
#if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR)
#error Non-trivial ctor ABI macro defined
#endif
template <class T>
struct HasTrivialABI : std::integral_constant<bool,
std::is_trivially_destructible<T>::value
&& (!std::is_copy_constructible<T>::value || std::is_trivially_copy_constructible<T>::value)
#if TEST_STD_VER >= 11
&& (!std::is_move_constructible<T>::value || std::is_trivially_move_constructible<T>::value)
#endif
> {};
#if TEST_STD_VER >= 11
struct NonTrivialDtor {
NonTrivialDtor(NonTrivialDtor const&) = default;
~NonTrivialDtor();
};
NonTrivialDtor::~NonTrivialDtor() {}
static_assert(!HasTrivialABI<NonTrivialDtor>::value, "");
struct NonTrivialCopy {
NonTrivialCopy(NonTrivialCopy const&);
};
NonTrivialCopy::NonTrivialCopy(NonTrivialCopy const&) {}
static_assert(!HasTrivialABI<NonTrivialCopy>::value, "");
struct NonTrivialMove {
NonTrivialMove(NonTrivialMove const&) = default;
NonTrivialMove(NonTrivialMove&&);
};
NonTrivialMove::NonTrivialMove(NonTrivialMove&&) {}
static_assert(!HasTrivialABI<NonTrivialMove>::value, "");
struct DeletedCopy {
DeletedCopy(DeletedCopy const&) = delete;
DeletedCopy(DeletedCopy&&) = default;
};
static_assert(HasTrivialABI<DeletedCopy>::value, "");
struct TrivialMove {
TrivialMove(TrivialMove &&) = default;
};
static_assert(HasTrivialABI<TrivialMove>::value, "");
struct Trivial {
Trivial(Trivial const&) = default;
};
static_assert(HasTrivialABI<Trivial>::value, "");
#endif
int main()
{
{
typedef std::pair<int, short> P;
static_assert(std::is_copy_constructible<P>::value, "");
static_assert(HasTrivialABI<P>::value, "");
}
#if TEST_STD_VER >= 11
{
typedef std::pair<int, short> P;
static_assert(std::is_move_constructible<P>::value, "");
static_assert(HasTrivialABI<P>::value, "");
}
{
using P = std::pair<NonTrivialDtor, int>;
static_assert(!std::is_trivially_destructible<P>::value, "");
static_assert(std::is_copy_constructible<P>::value, "");
static_assert(!std::is_trivially_copy_constructible<P>::value, "");
static_assert(std::is_move_constructible<P>::value, "");
static_assert(!std::is_trivially_move_constructible<P>::value, "");
static_assert(!HasTrivialABI<P>::value, "");
}
{
using P = std::pair<NonTrivialCopy, int>;
static_assert(std::is_copy_constructible<P>::value, "");
static_assert(!std::is_trivially_copy_constructible<P>::value, "");
static_assert(std::is_move_constructible<P>::value, "");
static_assert(!std::is_trivially_move_constructible<P>::value, "");
static_assert(!HasTrivialABI<P>::value, "");
}
{
using P = std::pair<NonTrivialMove, int>;
static_assert(std::is_copy_constructible<P>::value, "");
static_assert(std::is_trivially_copy_constructible<P>::value, "");
static_assert(std::is_move_constructible<P>::value, "");
static_assert(!std::is_trivially_move_constructible<P>::value, "");
static_assert(!HasTrivialABI<P>::value, "");
}
{
using P = std::pair<DeletedCopy, int>;
static_assert(!std::is_copy_constructible<P>::value, "");
static_assert(!std::is_trivially_copy_constructible<P>::value, "");
static_assert(std::is_move_constructible<P>::value, "");
static_assert(std::is_trivially_move_constructible<P>::value, "");
static_assert(HasTrivialABI<P>::value, "");
}
{
using P = std::pair<Trivial, int>;
static_assert(std::is_copy_constructible<P>::value, "");
static_assert(std::is_trivially_copy_constructible<P>::value, "");
static_assert(std::is_move_constructible<P>::value, "");
static_assert(std::is_trivially_move_constructible<P>::value, "");
static_assert(HasTrivialABI<P>::value, "");
}
{
using P = std::pair<TrivialMove, int>;
static_assert(!std::is_copy_constructible<P>::value, "");
static_assert(!std::is_trivially_copy_constructible<P>::value, "");
static_assert(std::is_move_constructible<P>::value, "");
static_assert(std::is_trivially_move_constructible<P>::value, "");
static_assert(HasTrivialABI<P>::value, "");
}
#endif
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment