libstdc++: Fix regression in std::move algorithm (PR 93872)
authorJonathan Wakely <jwakely@redhat.com>
Tue, 25 Feb 2020 12:21:44 +0000 (12:21 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 25 Feb 2020 12:21:44 +0000 (12:21 +0000)
commit5b904f175ff26269615f148459a8604f45880591
treed5bb4382caa9c91036e35441c9974f970521d9bb
parent2877ad9ac28e1c7f0a6e643ca8f03f795e0f4985
libstdc++: Fix regression in std::move algorithm (PR 93872)

The std::move and std::move_backward algorithms dispatch to the
std::__memmove helper when appropriate. That function uses a
pointer-to-const for the source values, preventing them from being
moved. The two callers of that function have the same problem.

Rather than altering __memmove and its callers to work with const or
non-const source pointers, this takes a more conservative approach of
casting away the const at the point where we want to do a move
assignment. This relies on the fact that we only use __memmove when the
type is trivially copyable, so we know the move assignment doesn't alter
the source anyway.

PR libstdc++/93872
* include/bits/stl_algobase.h (__memmove): Cast away const before
doing move assignment.
* testsuite/25_algorithms/move/93872.cc: New test.
* testsuite/25_algorithms/move_backward/93872.cc: New test.
libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_algobase.h
libstdc++-v3/testsuite/25_algorithms/move/93872.cc [new file with mode: 0644]