Remove _LIBCPP_TRIVIAL_PAIR_COPY_CTOR option.

llvm-svn: 272613
This commit is contained in:
Eric Fiselier 2016-06-14 01:36:15 +00:00
parent 85c5531918
commit fbe79c9d25
5 changed files with 102 additions and 34 deletions

View File

@ -745,8 +745,8 @@ template <unsigned> struct __static_assert_check {};
#define _LIBCPP_WCTYPE_IS_MASK
#endif
#ifndef _LIBCPP_TRIVIAL_PAIR_COPY_CTOR
# define _LIBCPP_TRIVIAL_PAIR_COPY_CTOR 1
#ifdef _LIBCPP_TRIVIAL_PAIR_COPY_CTOR
# error the "_LIBCPP_TRIVIAL_PAIR_COPY_CTOR" option is no longer supported
#endif
#ifndef _LIBCPP_STD_VER
@ -879,7 +879,9 @@ extern "C" void __sanitizer_annotate_contiguous_container(
#if __cplusplus < 201103L
#define _LIBCPP_CXX03_LANG
#else
#if defined(_LIBCPP_HAS_NO_VARIADIC_TEMPLATES) || defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
#if defined(_LIBCPP_HAS_NO_VARIADIC_TEMPLATES) \
|| defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) \
|| defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTION)
#error Libc++ requires a feature complete C++11 compiler in C++11 or greater.
#endif
#endif

View File

@ -310,18 +310,9 @@ struct _LIBCPP_TYPE_VIS_ONLY pair
)
: first(__p.first), second(__p.second) {}
#if !defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && _LIBCPP_TRIVIAL_PAIR_COPY_CTOR
_LIBCPP_INLINE_VISIBILITY
pair(const pair& __p) = default;
#elif !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) || !_LIBCPP_TRIVIAL_PAIR_COPY_CTOR
_LIBCPP_INLINE_VISIBILITY
pair(const pair& __p)
_NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value &&
is_nothrow_copy_constructible<second_type>::value)
: first(__p.first),
second(__p.second)
{
}
#if !defined(_LIBCPP_CXX03_LANG)
_LIBCPP_INLINE_VISIBILITY pair(const pair& __p) = default;
_LIBCPP_INLINE_VISIBILITY pair(pair&& __p) = default;
#endif
_LIBCPP_INLINE_VISIBILITY
@ -353,19 +344,6 @@ struct _LIBCPP_TYPE_VIS_ONLY pair
: first(_VSTD::forward<_U1>(__p.first)),
second(_VSTD::forward<_U2>(__p.second)) {}
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
_LIBCPP_INLINE_VISIBILITY
pair(pair&& __p) = default;
#else
_LIBCPP_INLINE_VISIBILITY
pair(pair&& __p) _NOEXCEPT_(is_nothrow_move_constructible<first_type>::value &&
is_nothrow_move_constructible<second_type>::value)
: first(_VSTD::forward<first_type>(__p.first)),
second(_VSTD::forward<second_type>(__p.second))
{
}
#endif
_LIBCPP_INLINE_VISIBILITY
pair&
operator=(pair&& __p) _NOEXCEPT_(is_nothrow_move_assignable<first_type>::value &&

View File

@ -13,9 +13,6 @@
// pair(const pair&) = default;
// Doesn't pass due to use of is_trivially_* trait.
// XFAIL: gcc-4.9
#include <utility>
#include <cassert>
@ -30,9 +27,6 @@ int main()
assert(p2.first == 3);
assert(p2.second == 4);
}
static_assert((std::is_trivially_copy_constructible<std::pair<int, int> >::value), "");
#if TEST_STD_VER > 11
{
typedef std::pair<int, short> P1;

View File

@ -0,0 +1,44 @@
//===----------------------------------------------------------------------===//
//
// 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.
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03
// <utility>
// template <class T1, class T2> struct pair
// pair(pair&&) = default;
#include <utility>
#include <memory>
#include <cassert>
#include "test_macros.h"
struct Dummy {
Dummy(Dummy const&) = delete;
Dummy(Dummy &&) = default;
};
int main()
{
{
typedef std::pair<int, short> P1;
static_assert(std::is_move_constructible<P1>::value, "");
P1 p1(3, 4);
P1 p2 = std::move(p1);
assert(p2.first == 3);
assert(p2.second == 4);
}
{
using P = std::pair<Dummy, int>;
static_assert(!std::is_copy_constructible<P>::value, "");
static_assert(std::is_move_constructible<P>::value, "");
}
}

View File

@ -0,0 +1,50 @@
//===----------------------------------------------------------------------===//
//
// 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.
//
//===----------------------------------------------------------------------===//
// <utility>
// template <class T1, class T2> struct pair
// pair(pair const&) = default;
// pair(pair&&) = default;
// Doesn't pass due to use of is_trivially_* trait.
// XFAIL: gcc-4.9
#include <utility>
#include <cassert>
#include "test_macros.h"
struct Dummy {
Dummy(Dummy const&) = delete;
Dummy(Dummy &&) = default;
};
int main()
{
typedef std::pair<int, short> P;
{
static_assert(std::is_copy_constructible<P>::value, "");
static_assert(std::is_trivially_copy_constructible<P>::value, "");
}
#if TEST_STD_VER >= 11
{
static_assert(std::is_move_constructible<P>::value, "");
static_assert(std::is_trivially_move_constructible<P>::value, "");
}
{
using P1 = std::pair<Dummy, int>;
static_assert(!std::is_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_trivially_move_constructible<P1>::value, "");
}
#endif
}