public inbox for libstdc++-cvs@sourceware.org help / color / mirror / Atom feed
From: Alexandre Oliva <aoliva@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc(refs/users/aoliva/heads/testme)] libstdc++: Fix [multi]map/[multi]set move constructors noexcept qualification Date: Wed, 22 Jul 2020 08:47:55 +0000 (GMT) [thread overview] Message-ID: <20200722084755.599DB386F833@sourceware.org> (raw) [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain; charset="us-ascii", Size: 9737 bytes --] https://gcc.gnu.org/g:c832cf1c1d114aed70c2f84566cf4d63de0a56d0 commit c832cf1c1d114aed70c2f84566cf4d63de0a56d0 Author: François Dumont <fdumont@gcc.gnu.org> Date: Fri Jul 3 08:13:19 2020 +0200 libstdc++: Fix [multi]map/[multi]set move constructors noexcept qualification Container move constructors shall not consider their allocator move constructor qualification. libstdc++-v3/ChangeLog: * include/bits/stl_tree.h (_Rb_tree_impl(_Rb_tree_impl&&)): Add noexcept qualification based only on _Compare one. * testsuite/23_containers/map/cons/noexcept_move_construct.cc: Add static asserts. * testsuite/23_containers/multimap/cons/noexcept_move_construct.cc: Likewise. * testsuite/23_containers/multiset/cons/noexcept_move_construct.cc: Likewise. * testsuite/23_containers/set/cons/noexcept_move_construct.cc: Likewise. Diff: --- libstdc++-v3/include/bits/stl_tree.h | 4 ++- .../map/cons/noexcept_move_construct.cc | 32 +++++++++++++++++++++- .../multimap/cons/noexcept_move_construct.cc | 32 +++++++++++++++++++++- .../multiset/cons/noexcept_move_construct.cc | 32 +++++++++++++++++++++- .../set/cons/noexcept_move_construct.cc | 32 +++++++++++++++++++++- 5 files changed, 127 insertions(+), 5 deletions(-) diff --git a/libstdc++-v3/include/bits/stl_tree.h b/libstdc++-v3/include/bits/stl_tree.h index 5be15afa257..21b72cebf2e 100644 --- a/libstdc++-v3/include/bits/stl_tree.h +++ b/libstdc++-v3/include/bits/stl_tree.h @@ -698,7 +698,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : _Node_allocator(__a), _Base_key_compare(__comp) { } #else - _Rb_tree_impl(_Rb_tree_impl&&) = default; + _Rb_tree_impl(_Rb_tree_impl&&) + noexcept( is_nothrow_move_constructible<_Base_key_compare>::value ) + = default; explicit _Rb_tree_impl(_Node_allocator&& __a) diff --git a/libstdc++-v3/testsuite/23_containers/map/cons/noexcept_move_construct.cc b/libstdc++-v3/testsuite/23_containers/map/cons/noexcept_move_construct.cc index 119b199ddff..25d1c9b5aca 100644 --- a/libstdc++-v3/testsuite/23_containers/map/cons/noexcept_move_construct.cc +++ b/libstdc++-v3/testsuite/23_containers/map/cons/noexcept_move_construct.cc @@ -29,6 +29,33 @@ static_assert( std::is_nothrow_constructible<mtype, mtype&&, const typename mtype::allocator_type&>::value, "noexcept move constructor with allocator" ); +template<typename Type> + class not_noexcept_move_constructor_alloc : public std::allocator<Type> + { + public: + not_noexcept_move_constructor_alloc() noexcept { } + + not_noexcept_move_constructor_alloc( + const not_noexcept_move_constructor_alloc& x) noexcept + : std::allocator<Type>(x) + { } + + not_noexcept_move_constructor_alloc( + not_noexcept_move_constructor_alloc&& x) noexcept(false) + : std::allocator<Type>(std::move(x)) + { } + + template<typename _Tp1> + struct rebind + { typedef not_noexcept_move_constructor_alloc<_Tp1> other; }; + }; + +typedef std::map<int, int, std::less<int>, + not_noexcept_move_constructor_alloc<std::pair<const int, int>>> amtype; + +static_assert( std::is_nothrow_move_constructible<amtype>::value, + "noexcept move constructor with not noexcept alloc" ); + struct not_noexcept_less { not_noexcept_less() = default; @@ -42,6 +69,9 @@ struct not_noexcept_less typedef std::map<int, int, not_noexcept_less> emtype; +static_assert( !std::is_nothrow_move_constructible<emtype>::value, + "not noexcept move constructor with not noexcept less" ); + static_assert( !std::is_nothrow_constructible<emtype, emtype&&, const typename emtype::allocator_type&>::value, - "except move constructor with allocator" ); + "not noexcept move constructor with allocator" ); diff --git a/libstdc++-v3/testsuite/23_containers/multimap/cons/noexcept_move_construct.cc b/libstdc++-v3/testsuite/23_containers/multimap/cons/noexcept_move_construct.cc index 44c3015a282..af545ae297c 100644 --- a/libstdc++-v3/testsuite/23_containers/multimap/cons/noexcept_move_construct.cc +++ b/libstdc++-v3/testsuite/23_containers/multimap/cons/noexcept_move_construct.cc @@ -29,6 +29,33 @@ static_assert( std::is_nothrow_constructible<mmtype, mmtype&&, const typename mmtype::allocator_type&>::value, "noexcept move constructor with allocator" ); +template<typename Type> + class not_noexcept_move_constructor_alloc : public std::allocator<Type> + { + public: + not_noexcept_move_constructor_alloc() noexcept { } + + not_noexcept_move_constructor_alloc( + const not_noexcept_move_constructor_alloc& x) noexcept + : std::allocator<Type>(x) + { } + + not_noexcept_move_constructor_alloc( + not_noexcept_move_constructor_alloc&& x) noexcept(false) + : std::allocator<Type>(std::move(x)) + { } + + template<typename _Tp1> + struct rebind + { typedef not_noexcept_move_constructor_alloc<_Tp1> other; }; + }; + +typedef std::multimap<int, int, std::less<int>, + not_noexcept_move_constructor_alloc<std::pair<const int, int>>> ammtype; + +static_assert( std::is_nothrow_move_constructible<ammtype>::value, + "noexcept move constructor with not noexcept alloc" ); + struct not_noexcept_less { not_noexcept_less() = default; @@ -42,6 +69,9 @@ struct not_noexcept_less typedef std::multimap<int, int, not_noexcept_less> emmtype; +static_assert( !std::is_nothrow_move_constructible<emmtype>::value, + "not noexcept move constructor with not noexcept less" ); + static_assert( !std::is_nothrow_constructible<emmtype, emmtype&&, const typename emmtype::allocator_type&>::value, - "except move constructor with allocator" ); + "not noexcept move constructor with allocator" ); diff --git a/libstdc++-v3/testsuite/23_containers/multiset/cons/noexcept_move_construct.cc b/libstdc++-v3/testsuite/23_containers/multiset/cons/noexcept_move_construct.cc index 225b2206ad4..ed4d9128606 100644 --- a/libstdc++-v3/testsuite/23_containers/multiset/cons/noexcept_move_construct.cc +++ b/libstdc++-v3/testsuite/23_containers/multiset/cons/noexcept_move_construct.cc @@ -29,6 +29,33 @@ static_assert( std::is_nothrow_constructible<mstype, mstype&&, const typename mstype::allocator_type&>::value, "noexcept move constructor with allocator" ); +template<typename Type> + class not_noexcept_move_constructor_alloc : public std::allocator<Type> + { + public: + not_noexcept_move_constructor_alloc() noexcept { } + + not_noexcept_move_constructor_alloc( + const not_noexcept_move_constructor_alloc& x) noexcept + : std::allocator<Type>(x) + { } + + not_noexcept_move_constructor_alloc( + not_noexcept_move_constructor_alloc&& x) noexcept(false) + : std::allocator<Type>(std::move(x)) + { } + + template<typename _Tp1> + struct rebind + { typedef not_noexcept_move_constructor_alloc<_Tp1> other; }; + }; + +typedef std::multiset<int, std::less<int>, + not_noexcept_move_constructor_alloc<int>> amstype; + +static_assert( std::is_nothrow_move_constructible<amstype>::value, + "noexcept move constructor with not noexcept alloc" ); + struct not_noexcept_less { not_noexcept_less() = default; @@ -42,6 +69,9 @@ struct not_noexcept_less typedef std::multiset<int, not_noexcept_less> emstype; +static_assert( !std::is_nothrow_move_constructible<emstype>::value, + "not noexcept move constructor with not noexcept less" ); + static_assert( !std::is_nothrow_constructible<emstype, emstype&&, const typename emstype::allocator_type&>::value, - "except move constructor with allocator" ); + "not noexcept move constructor with allocator" ); diff --git a/libstdc++-v3/testsuite/23_containers/set/cons/noexcept_move_construct.cc b/libstdc++-v3/testsuite/23_containers/set/cons/noexcept_move_construct.cc index acd84a8fcd0..dc96236a668 100644 --- a/libstdc++-v3/testsuite/23_containers/set/cons/noexcept_move_construct.cc +++ b/libstdc++-v3/testsuite/23_containers/set/cons/noexcept_move_construct.cc @@ -29,6 +29,33 @@ static_assert( std::is_nothrow_constructible<stype, stype&&, const typename stype::allocator_type&>::value, "noexcept move constructor with allocator" ); +template<typename Type> + class not_noexcept_move_constructor_alloc : public std::allocator<Type> + { + public: + not_noexcept_move_constructor_alloc() noexcept { } + + not_noexcept_move_constructor_alloc( + const not_noexcept_move_constructor_alloc& x) noexcept + : std::allocator<Type>(x) + { } + + not_noexcept_move_constructor_alloc( + not_noexcept_move_constructor_alloc&& x) noexcept(false) + : std::allocator<Type>(std::move(x)) + { } + + template<typename _Tp1> + struct rebind + { typedef not_noexcept_move_constructor_alloc<_Tp1> other; }; + }; + +typedef std::set<int, std::less<int>, + not_noexcept_move_constructor_alloc<int>> astype; + +static_assert( std::is_nothrow_move_constructible<astype>::value, + "noexcept move constructor with not noexcept alloc" ); + struct not_noexcept_less { not_noexcept_less() = default; @@ -42,6 +69,9 @@ struct not_noexcept_less typedef std::set<int, not_noexcept_less> estype; +static_assert( !std::is_nothrow_move_constructible<estype>::value, + "not noexcept move constructor with not noexcept less" ); + static_assert( !std::is_nothrow_constructible<estype, estype&&, const typename estype::allocator_type&>::value, - "except move constructor with allocator" ); + "not noexcept move constructor with allocator" );
reply other threads:[~2020-07-22 8:47 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200722084755.599DB386F833@sourceware.org \ --to=aoliva@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ --cc=libstdc++-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).