I replied to bugzilla rather than sending to proper mailing list !

At the same time it looks like you also found the root cause of the problem Jonathan. Just let me know if you want to deal with it eventually.

François


-------- Forwarded Message --------
Subject:        Re: [Bug libstdc++/90276] PSTL tests fail in Debug Mode
Date:   Wed, 31 Jan 2024 19:09:02 +0100
From:   François Dumont <frs.dum...@gmail.com>
To: redi at gcc dot gnu.org <gcc-bugzi...@gcc.gnu.org>, fdum...@gcc.gnu.org



Here is the reason of the 20_util/specialized_algorithms/pstl/uninitialized_copy_move.cc FAIL.

Maybe it fixes some other tests too, I need to run all of them.

    libstdc++: Do not forward arguments several times [PR90276]

    Forwarding several times the same arguments results in UB. It is detected     by the _GLIBCXX_DEBUG mode as an attempt to use a singular iterator which has
    been moved.

    libstdc++-v3/ChangeLog

            PR libstdc++/90276
            * testsuite/util/pstl/test_utils.h: Remove std::forward<> calls when
            done several times on the same arguments.

Ok to commit ?

François


On 31/01/2024 14:11, redi at gcc dot gnu.org wrote:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90276

Jonathan Wakely <redi at gcc dot gnu.org> changed:

What |Removed |Added
----------------------------------------------------------------------------
See Also| |https://github.com/llvm/llv
| |m-project/issues/80136
diff --git a/libstdc++-v3/testsuite/util/pstl/test_utils.h b/libstdc++-v3/testsuite/util/pstl/test_utils.h
index ed6d48b9471..fc3de6ae24b 100644
--- a/libstdc++-v3/testsuite/util/pstl/test_utils.h
+++ b/libstdc++-v3/testsuite/util/pstl/test_utils.h
@@ -1088,13 +1088,14 @@ struct reverse_invoker
     operator()(Rest&&... rest)
     {
         // Random-access iterator
-        iterator_invoker<std::random_access_iterator_tag, IsReverse>()(std::forward<Rest>(rest)...);
+        iterator_invoker<std::random_access_iterator_tag, IsReverse>()(rest...);
 
         // Forward iterator
-        iterator_invoker<std::forward_iterator_tag, IsReverse>()(std::forward<Rest>(rest)...);
+
+        iterator_invoker<std::forward_iterator_tag, IsReverse>()(rest...);
 
         // Bidirectional iterator
-        iterator_invoker<std::bidirectional_iterator_tag, IsReverse>()(std::forward<Rest>(rest)...);
+        iterator_invoker<std::bidirectional_iterator_tag, IsReverse>()(rest...);
     }
 };
 
@@ -1104,8 +1105,8 @@ struct invoke_on_all_iterator_types
     void
     operator()(Rest&&... rest)
     {
-        reverse_invoker</* IsReverse = */ std::false_type>()(std::forward<Rest>(rest)...);
-        reverse_invoker</* IsReverse = */ std::true_type>()(std::forward<Rest>(rest)...);
+        reverse_invoker</* IsReverse = */ std::false_type>()(rest...);
+        reverse_invoker</* IsReverse = */ std::true_type>()(rest...);
     }
 };
 //============================================================================
@@ -1118,10 +1119,10 @@ invoke_on_all_policies(Op op, T&&... rest)
     using namespace __pstl::execution;
 
     // Try static execution policies
-    invoke_on_all_iterator_types()(seq, op, std::forward<T>(rest)...);
-    invoke_on_all_iterator_types()(unseq, op, std::forward<T>(rest)...);
-    invoke_on_all_iterator_types()(par, op, std::forward<T>(rest)...);
-    invoke_on_all_iterator_types()(par_unseq, op, std::forward<T>(rest)...);
+    invoke_on_all_iterator_types()(seq, op, rest...);
+    invoke_on_all_iterator_types()(unseq, op, rest...);
+    invoke_on_all_iterator_types()(par, op, rest...);
+    invoke_on_all_iterator_types()(par_unseq, op, rest...);
 }
 
 template <typename F>

Reply via email to