diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2018-07-05 18:03:05 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2018-07-05 18:03:05 +0100 |
commit | 30236791e04a08c3a7edc49f00af4c63c4cb6a9d (patch) | |
tree | 17f335ab5f2cf676bd0884f260dbc0267d65cd90 | |
parent | 99d2293dbfa03ddc5b0308858412ddded4c832a8 (diff) | |
download | gcc-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
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() |