From: Jonathan Wakely <jwakely@redhat.com>
To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org
Subject: [committed] libstdc++: Simplify noexcept-specifiers for move constructors
Date: Thu, 8 Apr 2021 17:50:18 +0100 [thread overview]
Message-ID: <YG80SsOS4033NG9f@redhat.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 917 bytes --]
This puts the logic for the noexcept-specifier in one place, and then
reuses it elsewhere. This means checking whether the move constructor
can throw doesn't need to do overload resolution and then check whether
some other constructor can throw, we just get the answer directly.
libstdc++-v3/ChangeLog:
* include/bits/hashtable.h (_Hashtable::_S_nothrow_move()):
New function to determine noexcept-specifier for move
constructors.
(_Hashtable): Use _S_nothrow_move() on move constructors.
* testsuite/23_containers/unordered_map/cons/noexcept_move_construct.cc:
Correct static assertion message.
* testsuite/23_containers/unordered_multimap/cons/noexcept_move_construct.cc:
Likewise.
* testsuite/23_containers/unordered_multiset/cons/noexcept_move_construct.cc:
Likewise.
* testsuite/23_containers/unordered_set/cons/noexcept_move_construct.cc:
Likewise.
Tested powerpc64le-linux. Committed to trunk.
[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 8754 bytes --]
commit 1cbba49e3417d9b0661e70301d6fb7a7f52fd360
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Thu Apr 8 16:29:11 2021
libstdc++: Simplify noexcept-specifiers for move constructors
This puts the logic for the noexcept-specifier in one place, and then
reuses it elsewhere. This means checking whether the move constructor
can throw doesn't need to do overload resolution and then check whether
some other constructor can throw, we just get the answer directly.
libstdc++-v3/ChangeLog:
* include/bits/hashtable.h (_Hashtable::_S_nothrow_move()):
New function to determine noexcept-specifier for move
constructors.
(_Hashtable): Use _S_nothrow_move() on move constructors.
* testsuite/23_containers/unordered_map/cons/noexcept_move_construct.cc:
Correct static assertion message.
* testsuite/23_containers/unordered_multimap/cons/noexcept_move_construct.cc:
Likewise.
* testsuite/23_containers/unordered_multiset/cons/noexcept_move_construct.cc:
Likewise.
* testsuite/23_containers/unordered_set/cons/noexcept_move_construct.cc:
Likewise.
diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h
index fa80675ad91..39872ce5342 100644
--- a/libstdc++-v3/include/bits/hashtable.h
+++ b/libstdc++-v3/include/bits/hashtable.h
@@ -472,10 +472,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__hashtable_alloc(__node_alloc_type(__a))
{ }
+ template<bool _No_realloc = true>
+ static constexpr bool
+ _S_nothrow_move()
+ {
+ if _GLIBCXX17_CONSTEXPR (_No_realloc)
+ if _GLIBCXX17_CONSTEXPR (is_nothrow_copy_constructible<_Hash>())
+ return is_nothrow_copy_constructible<_Equal>();
+ return false;
+ }
+
_Hashtable(_Hashtable&& __ht, __node_alloc_type&& __a,
true_type /* alloc always equal */)
- noexcept(std::is_nothrow_copy_constructible<_Hash>::value &&
- std::is_nothrow_copy_constructible<_Equal>::value);
+ noexcept(_S_nothrow_move());
_Hashtable(_Hashtable&&, __node_alloc_type&&,
false_type /* alloc always equal */);
@@ -508,19 +517,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// Use delegating constructors.
_Hashtable(_Hashtable&& __ht)
- noexcept( noexcept(
- _Hashtable(std::declval<_Hashtable>(),
- std::declval<__node_alloc_type>(),
- true_type{})) )
+ noexcept(_S_nothrow_move())
: _Hashtable(std::move(__ht), std::move(__ht._M_node_allocator()),
true_type{})
{ }
_Hashtable(_Hashtable&& __ht, const allocator_type& __a)
- noexcept( noexcept(
- _Hashtable(std::declval<_Hashtable>(),
- std::declval<__node_alloc_type>(),
- typename __node_alloc_traits::is_always_equal{})) )
+ noexcept(_S_nothrow_move<__node_alloc_traits::_S_always_equal()>())
: _Hashtable(std::move(__ht), __node_alloc_type(__a),
typename __node_alloc_traits::is_always_equal{})
{ }
@@ -1400,8 +1403,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_Hash, _RangeHash, _Unused, _RehashPolicy, _Traits>::
_Hashtable(_Hashtable&& __ht, __node_alloc_type&& __a,
true_type /* alloc always equal */)
- noexcept(std::is_nothrow_copy_constructible<_Hash>::value &&
- std::is_nothrow_copy_constructible<_Equal>::value)
+ noexcept(_S_nothrow_move())
: __hashtable_base(__ht),
__map_base(__ht),
__rehash_base(__ht),
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/cons/noexcept_move_construct.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/cons/noexcept_move_construct.cc
index 96245aa4c88..015646adf23 100644
--- a/libstdc++-v3/testsuite/23_containers/unordered_map/cons/noexcept_move_construct.cc
+++ b/libstdc++-v3/testsuite/23_containers/unordered_map/cons/noexcept_move_construct.cc
@@ -40,7 +40,7 @@ struct not_noexcept_copy_cons_hash
using type2 = std::unordered_map<int, int, not_noexcept_copy_cons_hash>;
static_assert( !std::is_nothrow_move_constructible<type2>::value,
- "noexcept move constructor" );
+ "not noexcept move constructor" );
static_assert( !std::is_nothrow_constructible<type2, type2&&,
const typename type2::allocator_type&>::value,
"not noexcept move constructor with allocator" );
@@ -59,7 +59,7 @@ using type3 = std::unordered_map<int, int, std::hash<int>,
not_noexcept_copy_cons_equal_to>;
static_assert( !std::is_nothrow_move_constructible<type3>::value,
- "noexcept move constructor" );
+ "not noexcept move constructor" );
static_assert( !std::is_nothrow_constructible<type3, type3&&,
const typename type3::allocator_type&>::value,
"not noexcept move constructor with allocator" );
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/noexcept_move_construct.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/noexcept_move_construct.cc
index efc8d337e7e..1e0b1059d7d 100644
--- a/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/noexcept_move_construct.cc
+++ b/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/noexcept_move_construct.cc
@@ -40,7 +40,7 @@ struct not_noexcept_copy_cons_hash
using type2 = std::unordered_multimap<int, int, not_noexcept_copy_cons_hash>;
static_assert( !std::is_nothrow_move_constructible<type2>::value,
- "noexcept move constructor" );
+ "not not noexcept move constructor" );
static_assert( !std::is_nothrow_constructible<type2, type2&&,
const typename type2::allocator_type&>::value,
"not noexcept move constructor with allocator" );
@@ -59,7 +59,7 @@ using type3 = std::unordered_multimap<int, int, std::hash<int>,
not_noexcept_copy_cons_equal_to>;
static_assert( !std::is_nothrow_move_constructible<type3>::value,
- "noexcept move constructor" );
+ "not not noexcept move constructor" );
static_assert( !std::is_nothrow_constructible<type3, type3&&,
const typename type3::allocator_type&>::value,
"not noexcept move constructor with allocator" );
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/noexcept_move_construct.cc b/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/noexcept_move_construct.cc
index cc2a8e31051..3e603802f13 100644
--- a/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/noexcept_move_construct.cc
+++ b/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/noexcept_move_construct.cc
@@ -40,7 +40,7 @@ struct not_noexcept_copy_cons_hash
using type2 = std::unordered_multiset<int, not_noexcept_copy_cons_hash>;
static_assert( !std::is_nothrow_move_constructible<type2>::value,
- "noexcept move constructor" );
+ "not noexcept move constructor" );
static_assert( !std::is_nothrow_constructible<type2, type2&&,
const typename type2::allocator_type&>::value,
"not noexcept move constructor with allocator" );
@@ -59,7 +59,7 @@ using type3 = std::unordered_multiset<int, std::hash<int>,
not_noexcept_copy_cons_equal_to>;
static_assert( !std::is_nothrow_move_constructible<type3>::value,
- "noexcept move constructor" );
+ "not noexcept move constructor" );
static_assert( !std::is_nothrow_constructible<type3, type3&&,
const typename type3::allocator_type&>::value,
"not noexcept move constructor with allocator" );
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/cons/noexcept_move_construct.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/cons/noexcept_move_construct.cc
index f68095302d5..28cb539e9f5 100644
--- a/libstdc++-v3/testsuite/23_containers/unordered_set/cons/noexcept_move_construct.cc
+++ b/libstdc++-v3/testsuite/23_containers/unordered_set/cons/noexcept_move_construct.cc
@@ -40,7 +40,7 @@ struct not_noexcept_copy_cons_hash
using type2 = std::unordered_set<int, not_noexcept_copy_cons_hash>;
static_assert( !std::is_nothrow_move_constructible<type2>::value,
- "noexcept move constructor" );
+ "not noexcept move constructor" );
static_assert( !std::is_nothrow_constructible<type2, type2&&,
const typename type2::allocator_type&>::value,
"not noexcept move constructor with allocator" );
@@ -59,7 +59,7 @@ using type3 = std::unordered_set<int, std::hash<int>,
not_noexcept_copy_cons_equal_to>;
static_assert( !std::is_nothrow_move_constructible<type3>::value,
- "noexcept move constructor" );
+ "not noexcept move constructor" );
static_assert( !std::is_nothrow_constructible<type3, type3&&,
const typename type3::allocator_type&>::value,
"not noexcept move constructor with allocator" );
next reply other threads:[~2021-04-08 16:50 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-08 16:50 Jonathan Wakely [this message]
2021-04-09 12:06 ` Jonathan Wakely
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=YG80SsOS4033NG9f@redhat.com \
--to=jwakely@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=libstdc++@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: link
Be 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).