libstdc++: Fix use of is_nothrow_assignable_v in <bits/ranges_uninitialized.h>
authorPatrick Palka <ppalka@redhat.com>
Tue, 3 Mar 2020 00:39:13 +0000 (19:39 -0500)
committerPatrick Palka <ppalka@redhat.com>
Wed, 4 Mar 2020 03:35:34 +0000 (22:35 -0500)
commit05779e2c89e06d09a6b685797e87723f7906a5ce
tree8fae04431c834ede3aa8d0c7e77a6525bb2274bf
parent7f327e8765c25552a1a6ae7d8747f74786f243dd
libstdc++: Fix use of is_nothrow_assignable_v in <bits/ranges_uninitialized.h>

We are passing a value type as the first argument to is_nothrow_assignable_v,
but the result of that is inevitably 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.
libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/ranges_uninitialized.h