diff options
| -rw-r--r-- | libcxx/include/__config | 8 | ||||
| -rw-r--r-- | libcxx/include/utility | 28 |
2 files changed, 28 insertions, 8 deletions
diff --git a/libcxx/include/__config b/libcxx/include/__config index cbe2bdcae15..e28fc5d58d6 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -746,8 +746,8 @@ template <unsigned> struct __static_assert_check {}; #define _LIBCPP_WCTYPE_IS_MASK #endif -#ifdef _LIBCPP_TRIVIAL_PAIR_COPY_CTOR -# error the "_LIBCPP_TRIVIAL_PAIR_COPY_CTOR" option is no longer supported +#ifndef _LIBCPP_TRIVIAL_PAIR_COPY_CTOR +# define _LIBCPP_TRIVIAL_PAIR_COPY_CTOR 1 #endif #ifndef _LIBCPP_STD_VER @@ -880,9 +880,7 @@ 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) \ - || defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTION) +#if defined(_LIBCPP_HAS_NO_VARIADIC_TEMPLATES) || defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) #error Libc++ requires a feature complete C++11 compiler in C++11 or greater. #endif #endif diff --git a/libcxx/include/utility b/libcxx/include/utility index d9d57a7d780..27b81a0305e 100644 --- a/libcxx/include/utility +++ b/libcxx/include/utility @@ -310,9 +310,18 @@ struct _LIBCPP_TYPE_VIS_ONLY pair ) : 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; +#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) + { + } #endif _LIBCPP_INLINE_VISIBILITY @@ -344,6 +353,19 @@ 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 && |

