aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2025-01-29 10:02:28 -0500
committerPatrick Palka <ppalka@redhat.com>2025-01-29 10:02:28 -0500
commit09d1cbee10b8c51aed48f047f30717f622d6f811 (patch)
treed13b64df825d3983bea8fca12081991cc43980ab
parentdc6b949c553a3be1ce4d6671fb8a9de213ede114 (diff)
downloadgcc-09d1cbee10b8c51aed48f047f30717f622d6f811.zip
gcc-09d1cbee10b8c51aed48f047f30717f622d6f811.tar.gz
gcc-09d1cbee10b8c51aed48f047f30717f622d6f811.tar.bz2
libstdc++: Fix views::transform(move_only_fn{}) forwarding [PR118413]
The range adaptor perfect forwarding simplification mechanism is currently only enabled for trivially copyable bound arguments, to prevent undesirable copies of complex objects. But "trivially copyable" is the wrong property to check for here, since a move-only type with a trivial move constructor is considered trivially copyable, and after P2492R2 we can't assume copy constructibility of the bound arguments. This patch makes the mechanism more specifically check for trivial copy constructibility instead so that it's properly disabled for move-only bound arguments. PR libstdc++/118413 libstdc++-v3/ChangeLog: * include/std/ranges (views::__adaptor::_Partial): Adjust constraints on the "simple" partial specializations to require is_trivially_copy_constructible_v instead of is_trivially_copyable_v. * testsuite/std/ranges/adaptors/adjacent_transform/1.cc (test04): Extend P2494R2 test. * testsuite/std/ranges/adaptors/transform.cc (test09): Likewise. Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
-rw-r--r--libstdc++-v3/include/std/ranges4
-rw-r--r--libstdc++-v3/testsuite/std/ranges/adaptors/adjacent_transform/1.cc1
-rw-r--r--libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc2
3 files changed, 5 insertions, 2 deletions
diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index ad69a94..5c795a9 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -1145,7 +1145,7 @@ namespace views::__adaptor
// which makes overload resolution failure diagnostics more concise.
template<typename _Adaptor, typename... _Args>
requires __adaptor_has_simple_extra_args<_Adaptor, _Args...>
- && (is_trivially_copyable_v<_Args> && ...)
+ && (is_trivially_copy_constructible_v<_Args> && ...)
struct _Partial<_Adaptor, _Args...> : _RangeAdaptorClosure<_Partial<_Adaptor, _Args...>>
{
tuple<_Args...> _M_args;
@@ -1176,7 +1176,7 @@ namespace views::__adaptor
// where _Adaptor accepts a single extra argument.
template<typename _Adaptor, typename _Arg>
requires __adaptor_has_simple_extra_args<_Adaptor, _Arg>
- && is_trivially_copyable_v<_Arg>
+ && is_trivially_copy_constructible_v<_Arg>
struct _Partial<_Adaptor, _Arg> : _RangeAdaptorClosure<_Partial<_Adaptor, _Arg>>
{
_Arg _M_arg;
diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/adjacent_transform/1.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/adjacent_transform/1.cc
index a5791b3..772e4b3 100644
--- a/libstdc++-v3/testsuite/std/ranges/adaptors/adjacent_transform/1.cc
+++ b/libstdc++-v3/testsuite/std/ranges/adaptors/adjacent_transform/1.cc
@@ -110,6 +110,7 @@ test04()
};
// P2494R2 Relaxing range adaptors to allow for move only types
static_assert( requires { views::pairwise_transform(x, move_only{}); } );
+ static_assert( requires { x | views::pairwise_transform(move_only{}); } );
}
int
diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc
index dfc91fb..934d2f6 100644
--- a/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc
+++ b/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc
@@ -191,8 +191,10 @@ test09()
#if __cpp_lib_ranges >= 202207L
// P2494R2 Relaxing range adaptors to allow for move only types
static_assert( requires { transform(x, move_only{}); } );
+ static_assert( requires { x | transform(move_only{}); } ); // PR libstdc++/118413
#else
static_assert( ! requires { transform(x, move_only{}); } );
+ static_assert( ! requires { x | transform(move_only{}); } );
#endif
}