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>