Partially Revert r272613. FreeBSD needs the non-trivial constructors in pair.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@272671 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/__config b/include/__config
index cbe2bdc..e28fc5d 100644
--- a/include/__config
+++ b/include/__config
@@ -746,8 +746,8 @@
 #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 @@
 #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/include/utility b/include/utility
index d9d57a7..27b81a0 100644
--- a/include/utility
+++ b/include/utility
@@ -310,9 +310,18 @@
                                       )
             : 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 @@
             : 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 &&