From ff2e7f1973807759f52808a2594e0635ced69619 Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Thu, 22 Nov 2018 19:10:05 +0100 Subject: [PATCH] Improve relocation 2018-11-22 Marc Glisse PR libstdc++/87106 * include/bits/stl_algobase.h: Include . (__niter_base): Add noexcept specification. * include/bits/stl_deque.h: Include . (__is_trivially_relocatable): Specialize for deque. * include/bits/stl_iterator.h: Include . (__niter_base): Add noexcept specification. * include/bits/stl_uninitialized.h (__is_trivially_relocatable): Add parameter for meta-programming. (__relocate_a_1, __relocate_a): Add noexcept specification. * include/bits/stl_vector.h (__use_relocate): Test __relocate_a. From-SVN: r266386 --- libstdc++-v3/ChangeLog | 14 ++++++++++++++ libstdc++-v3/include/bits/stl_algobase.h | 4 ++++ libstdc++-v3/include/bits/stl_deque.h | 10 ++++++++++ libstdc++-v3/include/bits/stl_iterator.h | 5 +++++ libstdc++-v3/include/bits/stl_uninitialized.h | 13 ++++++++----- libstdc++-v3/include/bits/stl_vector.h | 8 ++++---- 6 files changed, 45 insertions(+), 9 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 267ec3999f2..1e8072db07e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,17 @@ +2018-11-22 Marc Glisse + + PR libstdc++/87106 + * include/bits/stl_algobase.h: Include . + (__niter_base): Add noexcept specification. + * include/bits/stl_deque.h: Include . + (__is_trivially_relocatable): Specialize for deque. + * include/bits/stl_iterator.h: Include . + (__niter_base): Add noexcept specification. + * include/bits/stl_uninitialized.h (__is_trivially_relocatable): + Add parameter for meta-programming. + (__relocate_a_1, __relocate_a): Add noexcept specification. + * include/bits/stl_vector.h (__use_relocate): Test __relocate_a. + 2018-11-22 Jonathan Wakely PR libstdc++/85930 diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h index b1ecd83ddb7..d1e1f67d385 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -69,6 +69,9 @@ #include #include // For std::swap #include +#if __cplusplus >= 201103L +# include +#endif namespace std _GLIBCXX_VISIBILITY(default) { @@ -275,6 +278,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template inline _Iterator __niter_base(_Iterator __it) + _GLIBCXX_NOEXCEPT_IF(std::is_nothrow_copy_constructible<_Iterator>::value) { return __it; } // Reverse the __niter_base transformation to get a diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h index 555be16dcd5..5d1b4281a33 100644 --- a/libstdc++-v3/include/bits/stl_deque.h +++ b/libstdc++-v3/include/bits/stl_deque.h @@ -61,6 +61,7 @@ #include #if __cplusplus >= 201103L #include +#include // for __is_trivially_relocatable #endif #include @@ -2366,6 +2367,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER #undef _GLIBCXX_DEQUE_BUF_SIZE _GLIBCXX_END_NAMESPACE_CONTAINER + +#if __cplusplus >= 201103L + // std::allocator is safe, but it is not the only allocator + // for which this is valid. + template + struct __is_trivially_relocatable<_GLIBCXX_STD_C::deque<_Tp>> + : true_type { }; +#endif + _GLIBCXX_END_NAMESPACE_VERSION } // namespace std diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index d4a3e9ea1b1..1f0c0813054 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -65,6 +65,10 @@ #include #include +#if __cplusplus >= 201103L +# include +#endif + #if __cplusplus > 201402L # define __cpp_lib_array_constexpr 201603 #endif @@ -1004,6 +1008,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template _Iterator __niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it) + _GLIBCXX_NOEXCEPT_IF(std::is_nothrow_copy_constructible<_Iterator>::value) { return __it.base(); } #if __cplusplus >= 201103L diff --git a/libstdc++-v3/include/bits/stl_uninitialized.h b/libstdc++-v3/include/bits/stl_uninitialized.h index 8839bfdcc90..cec01344213 100644 --- a/libstdc++-v3/include/bits/stl_uninitialized.h +++ b/libstdc++-v3/include/bits/stl_uninitialized.h @@ -894,14 +894,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } // This class may be specialized for specific types. - template + template struct __is_trivially_relocatable : is_trivial<_Tp> { }; template inline __enable_if_t::value, _Tp*> __relocate_a_1(_Tp* __first, _Tp* __last, - _Tp* __result, allocator<_Up>& __alloc) + _Tp* __result, allocator<_Up>& __alloc) noexcept { ptrdiff_t __count = __last - __first; if (__count > 0) @@ -914,15 +914,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline _ForwardIterator __relocate_a_1(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _Allocator& __alloc) + noexcept(noexcept(std::__relocate_object_a(std::addressof(*__result), + std::addressof(*__first), + __alloc))) { typedef typename iterator_traits<_InputIterator>::value_type _ValueType; typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType2; static_assert(std::is_same<_ValueType, _ValueType2>::value); - static_assert(noexcept(std::__relocate_object_a(std::addressof(*__result), - std::addressof(*__first), - __alloc))); _ForwardIterator __cur = __result; for (; __first != __last; ++__first, (void)++__cur) std::__relocate_object_a(std::__addressof(*__cur), @@ -935,6 +935,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline _ForwardIterator __relocate_a(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _Allocator& __alloc) + noexcept(noexcept(__relocate_a_1(std::__niter_base(__first), + std::__niter_base(__last), + std::__niter_base(__result), __alloc))) { return __relocate_a_1(std::__niter_base(__first), std::__niter_base(__last), diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index 05f9b7ef6c3..07dcd581ff7 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -425,10 +425,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER private: #if __cplusplus >= 201103L static constexpr bool __use_relocate = - noexcept(std::__relocate_object_a( - std::addressof(*std::declval()), - std::addressof(*std::declval()), - std::declval<_Tp_alloc_type&>())); + noexcept(std::__relocate_a(std::declval(), + std::declval(), + std::declval(), + std::declval<_Tp_alloc_type&>())); #endif protected: