[PATCH] libstdc++/92124 for associative containers

Jonathan Wakely jwakely@redhat.com
Mon Jan 6 15:19:00 GMT 2020


On 03/01/20 22:04 +0100, François Dumont wrote:
>This is the patch to extend PR 92124 to the associative containers.
>
>As it is pretty simple I thought it could maybe go in now.
>
>I also think that the existing 92124 tests are not really testing what 
>they should with the move assignment operators noexcept qualified, no 
>?
>
>    PR libstdc++/92124
>    * include/bits/stl_tree.h
>    (_Rb_tree<>::_M_move_assign(_Rb_tree&, false_type)): Replace
>    std::move_if_noexcept by std::move.
>    * testsuite/23_containers/deque/92124.cc
>    (X::operator==(X&&)): Qualify noexcept(false).
>    * testsuite/23_containers/forward_list/92124.cc: Likewise.
>    * testsuite/23_containers/list/92124.cc: Likewise.
>    * testsuite/23_containers/vector/92124.cc: Likewise.
>    * testsuite/23_containers/map/92124.cc: New.
>    * testsuite/23_containers/set/92124.cc: New.
>
>Tested under linux x86_64.
>
>François
>

>diff --git a/libstdc++-v3/include/bits/stl_tree.h b/libstdc++-v3/include/bits/stl_tree.h
>index 12ba3181dd9..9339011e872 100644
>--- a/libstdc++-v3/include/bits/stl_tree.h
>+++ b/libstdc++-v3/include/bits/stl_tree.h
>@@ -1695,7 +1695,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> 	    [&__roan](const value_type& __cval)
> 	    {
> 	      auto& __val = const_cast<value_type&>(__cval);
>-	      return __roan(std::move_if_noexcept(__val));
>+	      return __roan(std::move(__val));

This part is OK and so is the new test.

> 	    };
> 	  _M_root() = _M_copy(__x, __lbd);
> 	  __x.clear();
>diff --git a/libstdc++-v3/testsuite/23_containers/deque/92124.cc b/libstdc++-v3/testsuite/23_containers/deque/92124.cc
>index 0bdfcb70dcf..ea16d415a49 100644
>--- a/libstdc++-v3/testsuite/23_containers/deque/92124.cc
>+++ b/libstdc++-v3/testsuite/23_containers/deque/92124.cc
>@@ -30,7 +30,7 @@ struct X {
>     // Tracking calls to assignment functions
>     X& operator=(const X&) { throw 1; }
> 
>-    X& operator=(X&&) noexcept(true) { return *this; }
>+    X& operator=(X&&) noexcept(false) { return *this; }

These changes don't seem to be needed. Is there a reason to change it?



More information about the Libstdc++ mailing list