svn commit: r315702 - stable/11/contrib/libc++/include

Dimitry Andric dim at FreeBSD.org
Wed Mar 22 07:09:32 UTC 2017


Author: dim
Date: Wed Mar 22 07:09:30 2017
New Revision: 315702
URL: https://svnweb.freebsd.org/changeset/base/315702

Log:
  Pull in r283944 from upstream libc++ trunk (by Eric Fiselier):
  
    Fix std::pair on FreeBSD
  
    Summary:
    FreeBSD ships an old ABI for std::pair which requires that it have
    non-trivial copy/move constructors. Currently the non-trivial
    copy/move is achieved by providing explicit definitions of the
    constructors. This is problematic because it means the constructors
    don't SFINAE properly. In order to SFINAE copy/move constructors they
    have to be explicitly defaulted and hense non-trivial.
  
    This patch attempts to provide SFINAE'ing copy/move constructors for
    std::pair while still making them non-trivial. It does this by adding
    a base class with a non-trivial copy constructor and then allowing
    pair's constructors to be generated by the compiler. This also allows
    the constructors to be constexpr.
  
    Reviewers: emaste, theraven, rsmith, dim
  
    Subscribers: cfe-commits
  
    Differential Revision: https://reviews.llvm.org/D25389
  
  This should fix building www/chromium 57.0.2987.110 on stable/11,
  without further hacks.  Direct commit to stable/11, since head already
  has libc++ 4.0, which includes this fix.
  
  Reported by:	cpm

Modified:
  stable/11/contrib/libc++/include/utility

Modified: stable/11/contrib/libc++/include/utility
==============================================================================
--- stable/11/contrib/libc++/include/utility	Wed Mar 22 07:05:27 2017	(r315701)
+++ stable/11/contrib/libc++/include/utility	Wed Mar 22 07:09:30 2017	(r315702)
@@ -276,8 +276,20 @@ extern const piecewise_construct_t piece
 constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t();
 #endif
 
+#if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR)
+struct __non_trivially_copyable_base {
+  _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+  __non_trivially_copyable_base() _NOEXCEPT {}
+  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+  __non_trivially_copyable_base(__non_trivially_copyable_base const&) _NOEXCEPT {}
+};
+#endif
+
 template <class _T1, class _T2>
 struct _LIBCPP_TYPE_VIS_ONLY pair
+#if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR)
+: private __non_trivially_copyable_base
+#endif
 {
     typedef _T1 first_type;
     typedef _T2 second_type;
@@ -307,26 +319,7 @@ struct _LIBCPP_TYPE_VIS_ONLY pair
                                       )
             : first(__p.first), second(__p.second) {}
 
-#if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_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)
-    {
-    }
-
-# ifndef _LIBCPP_CXX03_LANG
-    _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
-#elif !defined(_LIBCPP_CXX03_LANG)
+#if !defined(_LIBCPP_CXX03_LANG)
     pair(pair const&) = default;
     pair(pair&&) = default;
 #else


More information about the svn-src-all mailing list