libstdc++: Fix regressions in unique_ptr::swap (PR 93562)
authorJonathan Wakely <jwakely@redhat.com>
Tue, 4 Feb 2020 12:59:14 +0000 (12:59 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 4 Feb 2020 13:02:37 +0000 (13:02 +0000)
commit9962493ca2f71d3f3dd06b0e9cd19fcf849e3e4b
tree2bcdd7d3ee397e99f0bd462b8bba0cf6e1f7d9f2
parent59afd6ad83665ad93d3c87af238a21a9c1c38079
libstdc++: Fix regressions in unique_ptr::swap (PR 93562)

The requirements for this function are only that the deleter is
swappable, but we incorrectly require that the element type is complete
and that the deleter can be swapped using std::swap (which requires it
to be move cosntructible and move assignable).

The fix is to add __uniq_ptr_impl::swap which swaps the pointer and
deleter individually, instead of using the generic std::swap on the
tuple containing them.

PR libstdc++/93562
* include/bits/unique_ptr.h (__uniq_ptr_impl::swap): Define.
(unique_ptr::swap, unique_ptr<T[], D>::swap): Call it.
* testsuite/20_util/unique_ptr/modifiers/93562.cc: New test.
libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/unique_ptr.h
libstdc++-v3/testsuite/20_util/unique_ptr/modifiers/93562.cc [new file with mode: 0644]