diff options
author | François Dumont <fdumont@gcc.gnu.org> | 2021-03-26 21:22:52 +0100 |
---|---|---|
committer | François Dumont <fdumont@gcc.gnu.org> | 2021-03-28 22:06:33 +0200 |
commit | d04c246cae674da081e1c9d8ba631560fee2fa91 (patch) | |
tree | 79fc27c8c9b462fcbe779fc100074bc4041943e2 | |
parent | 46720db72cadfb85501e102d94e06683300a2327 (diff) | |
download | gcc-d04c246cae674da081e1c9d8ba631560fee2fa91.zip gcc-d04c246cae674da081e1c9d8ba631560fee2fa91.tar.gz gcc-d04c246cae674da081e1c9d8ba631560fee2fa91.tar.bz2 |
libstdc++: _GLIBCXX_DEBUG Fix allocator-extended move constructor
libstdc++-v3/ChangeLog:
* include/debug/forward_list
(forward_list(forward_list&&, const allocator_type&)): Add noexcept qualification.
* include/debug/list (list(list&&, const allocator_type&)): Likewise and add
call to safe container allocator aware move constructor.
* include/debug/vector (vector(vector&&, const allocator_type&)):
Fix noexcept qualification.
* testsuite/23_containers/forward_list/cons/noexcept_move_construct.cc:
Add allocator-extended move constructor noexceot qualification check.
* testsuite/23_containers/list/cons/noexcept_move_construct.cc: Likewise.
5 files changed, 23 insertions, 7 deletions
diff --git a/libstdc++-v3/include/debug/forward_list b/libstdc++-v3/include/debug/forward_list index db46705..16f0531 100644 --- a/libstdc++-v3/include/debug/forward_list +++ b/libstdc++-v3/include/debug/forward_list @@ -239,8 +239,11 @@ namespace __debug { } forward_list(forward_list&& __list, const allocator_type& __al) - : _Safe(std::move(__list._M_safe()), __al), - _Base(std::move(__list._M_base()), __al) + noexcept( + std::is_nothrow_constructible<_Base, + _Base, const allocator_type&>::value ) + : _Safe(std::move(__list._M_safe()), __al), + _Base(std::move(__list._M_base()), __al) { } explicit diff --git a/libstdc++-v3/include/debug/list b/libstdc++-v3/include/debug/list index 0693889..01fe43f 100644 --- a/libstdc++-v3/include/debug/list +++ b/libstdc++-v3/include/debug/list @@ -119,7 +119,11 @@ namespace __debug : _Base(__x, __a) { } list(list&& __x, const allocator_type& __a) - : _Base(std::move(__x), __a) { } + noexcept( + std::is_nothrow_constructible<_Base, + _Base, const allocator_type&>::value ) + : _Safe(std::move(__x._M_safe()), __a), + _Base(std::move(__x._M_base()), __a) { } #endif explicit diff --git a/libstdc++-v3/include/debug/vector b/libstdc++-v3/include/debug/vector index df179cb..987bba1 100644 --- a/libstdc++-v3/include/debug/vector +++ b/libstdc++-v3/include/debug/vector @@ -217,8 +217,9 @@ namespace __debug : _Base(__x, __a) { } vector(vector&& __x, const allocator_type& __a) - noexcept(noexcept( - _Base(std::declval<_Base&&>()), std::declval<const allocator_type&>())) + noexcept( + std::is_nothrow_constructible<_Base, + _Base, const allocator_type&>::value ) : _Safe(std::move(__x._M_safe()), __a), _Base(std::move(__x._M_base()), __a), _Safe_vector(std::move(__x)) { } diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/cons/noexcept_move_construct.cc b/libstdc++-v3/testsuite/23_containers/forward_list/cons/noexcept_move_construct.cc index 96f3876..0eb5a5c 100644 --- a/libstdc++-v3/testsuite/23_containers/forward_list/cons/noexcept_move_construct.cc +++ b/libstdc++-v3/testsuite/23_containers/forward_list/cons/noexcept_move_construct.cc @@ -23,4 +23,8 @@ typedef std::forward_list<int> fltype; -static_assert(std::is_nothrow_move_constructible<fltype>::value, "Error"); +static_assert( std::is_nothrow_move_constructible<fltype>::value, + "noexcept move constructor" ); +static_assert( std::is_nothrow_constructible<fltype, + fltype, const typename fltype::allocator_type&>::value, + "noexcept move constructor with allocator" ); diff --git a/libstdc++-v3/testsuite/23_containers/list/cons/noexcept_move_construct.cc b/libstdc++-v3/testsuite/23_containers/list/cons/noexcept_move_construct.cc index 5a2de10..858a0d7 100644 --- a/libstdc++-v3/testsuite/23_containers/list/cons/noexcept_move_construct.cc +++ b/libstdc++-v3/testsuite/23_containers/list/cons/noexcept_move_construct.cc @@ -23,4 +23,8 @@ typedef std::list<int> ltype; -static_assert(std::is_nothrow_move_constructible<ltype>::value, "Error"); +static_assert( std::is_nothrow_move_constructible<ltype>::value, + "noexcept move constructor" ); +static_assert( std::is_nothrow_constructible<ltype, + ltype, const typename ltype::allocator_type&>::value, + "noexcept move constructor with allocator" ); |