On 03/03/20 11:30 -0500, Patrick Palka wrote:
We are passing a value type as the first argument to is_nothrow_assignable_v,
but the result of that is always false. Since this predicate is a part of the
condition that guards the corresponding optimizations for these algorithms, this
bug means these optimizations are never used. We should be passing a reference
type to is_nothrow_assignable_v instead.
libstdc++-v3/ChangeLog:
* include/bits/ranges_uninitialized.h
(uninitialized_copy_fn::operator()): Pass a reference type as the first
argument to is_nothrow_assignable_v.
(uninitialized_copy_fn::operator()): Likewise.
(uninitialized_move_fn::operator()): Likewise. Return an in_out_result
with the input iterator stripped of its move_iterator.
(uninitialized_move_n_fn::operator()): Likewise.
(uninitialized_fill_fn::operator()): Pass a reference type as the first
argument to is_nothrow_assignable_v.
(uninitialized_fill_n_fn::operator()): Likewise.
OK.