http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59603

--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> ---
This patch avoids the self-move:

index 4c6ca8a..6ce2d21 100644
--- a/libstdc++-v3/include/bits/stl_algo.h
+++ b/libstdc++-v3/include/bits/stl_algo.h
@@ -4430,7 +4430,12 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO

       if (__first != __last)
        for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
-         std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1)));
+         {
+           int __offset = std::rand() % ((__i - __first) + 1);
+           _RandomAccessIterator __j = __first + __offset;
+           if (__i != __j)
+             std::iter_swap(__i, __j);
+         }
     }

   /**

But I'm not sure whether this is a real bug, or types used with random_shuffle
should be safe against self-move (which means they can't use an implicit move
ctor if they have types that are not safe against self-move, which includes
most std::lib types).

Reply via email to