[gcc(refs/users/ppalka/heads/libstdcxx-constrained-algos)] Restore some sanity to ranges::__copy_or_move

Patrick Palka ppalka@gcc.gnu.org
Wed Jan 22 23:22:00 GMT 2020


https://gcc.gnu.org/g:81f873306db3324641327298dfbdffb1347f6203

commit 81f873306db3324641327298dfbdffb1347f6203
Author: Patrick Palka <ppalka@redhat.com>
Date:   Wed Jan 22 18:14:05 2020 -0500

    Restore some sanity to ranges::__copy_or_move
    
    In particular, don't take the __first argument by forwarding reference, it's not
    necessary.

Diff:
---
 libstdc++-v3/include/bits/ranges_algo.h | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/libstdc++-v3/include/bits/ranges_algo.h b/libstdc++-v3/include/bits/ranges_algo.h
index 2102f8a..bbfb2aa 100644
--- a/libstdc++-v3/include/bits/ranges_algo.h
+++ b/libstdc++-v3/include/bits/ranges_algo.h
@@ -816,21 +816,23 @@ namespace ranges
   template<typename _Iter, typename _Out>
   using move_result = copy_result<_Iter, _Out>;
 
-  template<bool _IsMove, typename _Iter, typename _Sent, typename _Out>
+  template<bool _IsMove,
+	   input_iterator _Iter, sentinel_for<_Iter> _Sent,
+	   weakly_incrementable _Out>
     requires (_IsMove
-	      ? indirectly_movable<remove_reference_t<_Iter>, _Out>
-	      : indirectly_copyable<remove_reference_t<_Iter>, _Out>)
+	      ? indirectly_movable<_Iter, _Out>
+	      : indirectly_copyable<_Iter, _Out>)
     constexpr conditional_t<_IsMove,
-			    move_result<remove_reference_t<_Iter>, _Out>,
-			    copy_result<remove_reference_t<_Iter>, _Out>>
-    __copy_or_move(_Iter&& __first, _Sent __last, _Out __result)
+			    move_result<_Iter, _Out>,
+			    copy_result<_Iter, _Out>>
+    __copy_or_move(_Iter __first, _Sent __last, _Out __result)
     {
       // TODO: implement more specializations to be at least on par with
       // std::copy/std::move.
       if constexpr (sized_sentinel_for<_Sent, _Iter>)
 	{
-	  using _ValueTypeI = iterator_traits<_Iter>::value_type;
-	  using _ValueTypeO = iterator_traits<_Out>::value_type;
+	  using _ValueTypeI = iter_value_t<_Iter>;
+	  using _ValueTypeO = iter_value_t<_Out>;
 	  constexpr bool __use_memmove
 	    = (is_trivially_copyable_v<_ValueTypeI>
 	       && is_same_v<_ValueTypeI, _ValueTypeO>



More information about the Libstdc++-cvs mailing list