PR libstdc++/58265 add noexcept to basic_string::assign(basic_string&&)
authorJonathan Wakely <jwakely@redhat.com>
Thu, 5 Jul 2018 17:03:05 +0000 (18:03 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 5 Jul 2018 17:03:05 +0000 (18:03 +0100)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/basic_string.h
libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/char/move_assign.cc
libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/wchar_t/move_assign.cc

index 39b94917a2e722a9b40ba2f76f123e1cd0939289..c8b4ce4a6298af63c50ce7274497636b14f19d81 100644 (file)
@@ -1,5 +1,14 @@
 2018-07-05  Jonathan Wakely  <jwakely@redhat.com>
 
+       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()):
index baad58682b6df9f0270eae7b2a793f79e44bf649..2d1b9dc6c298f4ca2bb33f73789836627fa16284 100644 (file)
@@ -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;
index e9116b9c0e0f6934f11194eac61efa0406556de9..7089fea04c21154527244d3cde44f7c8ba6e34c8 100644 (file)
@@ -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()
index 74e342a8ef4af54ad3a7cf7ee1ab8a24f4f2a86a..8d394602a9f181319aacfbe625894cee3114d361 100644 (file)
@@ -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()