aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-07-05 18:03:05 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2018-07-05 18:03:05 +0100
commit30236791e04a08c3a7edc49f00af4c63c4cb6a9d (patch)
tree17f335ab5f2cf676bd0884f260dbc0267d65cd90
parent99d2293dbfa03ddc5b0308858412ddded4c832a8 (diff)
downloadgcc-30236791e04a08c3a7edc49f00af4c63c4cb6a9d.zip
gcc-30236791e04a08c3a7edc49f00af4c63c4cb6a9d.tar.gz
gcc-30236791e04a08c3a7edc49f00af4c63c4cb6a9d.tar.bz2
PR libstdc++/58265 add noexcept to basic_string::assign(basic_string&&)
PR libstdc++/58265 * include/bits/basic_string.h [!_GLIBCXX_USE_CXX11_ABI] (basic_string::assign(basic_string&&)): Add conditional noexcept depending on the allocator's is_always_equal property (LWG 2063). * testsuite/21_strings/basic_string/modifiers/assign/char/ move_assign.cc: Check for non-throwing exception specification. * testsuite/21_strings/basic_string/modifiers/assign/wchar_t/ move_assign.cc: Likewise. From-SVN: r262447
-rw-r--r--libstdc++-v3/ChangeLog9
-rw-r--r--libstdc++-v3/include/bits/basic_string.h3
-rw-r--r--libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/char/move_assign.cc3
-rw-r--r--libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/wchar_t/move_assign.cc3
4 files changed, 16 insertions, 2 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 39b9491..c8b4ce4 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -2,6 +2,15 @@
PR libstdc++/58265
* include/bits/basic_string.h [!_GLIBCXX_USE_CXX11_ABI]
+ (basic_string::assign(basic_string&&)): Add conditional noexcept
+ depending on the allocator's is_always_equal property (LWG 2063).
+ * testsuite/21_strings/basic_string/modifiers/assign/char/
+ move_assign.cc: Check for non-throwing exception specification.
+ * testsuite/21_strings/basic_string/modifiers/assign/wchar_t/
+ move_assign.cc: Likewise.
+
+ PR libstdc++/58265
+ * include/bits/basic_string.h [!_GLIBCXX_USE_CXX11_ABI]
[_GLIBCXX_FULLY_DYNAMIC_STRING==0] (basic_string::basic_string()):
Add GLIBCXX_NOEXCEPT.
(basic_string::operator=(basic_string&&)): Add _GLIBCXX_NOEXCEPT_IF
diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h
index baad586..2d1b9dc 100644
--- a/libstdc++-v3/include/bits/basic_string.h
+++ b/libstdc++-v3/include/bits/basic_string.h
@@ -725,7 +725,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
* The contents of @a str are moved into this string (without copying).
* @a str is a valid, but unspecified string.
**/
- // PR 58265, this should be noexcept.
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 2063. Contradictory requirements for string move assignment
basic_string&
@@ -4275,9 +4274,9 @@ _GLIBCXX_END_NAMESPACE_CXX11
* This function sets this string to the exact contents of @a __str.
* @a __str is a valid, but unspecified string.
*/
- // PR 58265, this should be noexcept.
basic_string&
assign(basic_string&& __str)
+ noexcept(allocator_traits<_Alloc>::is_always_equal::value)
{
this->swap(__str);
return *this;
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/char/move_assign.cc b/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/char/move_assign.cc
index e9116b9..7089fea 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/char/move_assign.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/char/move_assign.cc
@@ -32,6 +32,9 @@ void test01()
a.push_back('1');
b.assign(std::move(a));
VERIFY( b.size() == 1 && b[0] == '1' && a.size() == 0 );
+
+ // True for std::allocator because is_always_equal, but not true in general:
+ static_assert(noexcept(a.assign(std::move(b))), "lwg 2063");
}
int main()
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/wchar_t/move_assign.cc b/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/wchar_t/move_assign.cc
index 74e342a..8d39460 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/wchar_t/move_assign.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/wchar_t/move_assign.cc
@@ -32,6 +32,9 @@ void test01()
a.push_back(L'1');
b.assign(std::move(a));
VERIFY( b.size() == 1 && b[0] == '1' && a.size() == 0 );
+
+ // True for std::allocator because is_always_equal, but not true in general:
+ static_assert(noexcept(a.assign(std::move(b))), "lwg 2063");
}
int main()