[Bug libstdc++/93562] [8/9 Regression] unique_ptr::swap incorrectly uses generic std::swap

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Feb 26 15:39:00 GMT 2020


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93562

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
         Resolution|---                         |FIXED

--- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Fixed for 8.4 and 9.3 as well.

--- Comment #7 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-8 branch has been updated by Jonathan Wakely
<redi@gcc.gnu.org>:

https://gcc.gnu.org/g:e47c9cd77f5e60780f054aacb096315b1fcca8bb

commit r8-10088-ge47c9cd77f5e60780f054aacb096315b1fcca8bb
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Wed Feb 26 15:04:53 2020 +0000

    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.


More information about the Gcc-bugs mailing list