https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91308
Bug ID: 91308
Summary: [7/8/9/10 Regression] unique_ptr assignment fails with
different deleters
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Keywords: rejects-valid
Severity: minor
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Target Milestone: ---
As reported at https://gcc.gnu.org/ml/libstdc++/2019-07/msg00088.html this
fails to compile:
#include <memory>
struct D1
{
void operator()(int* p) const noexcept { }
};
struct D2 : D1
{
D2& operator=(D1&&) noexcept { return *this; }
};
void
test01()
{
std::unique_ptr<int, D1> d1;
std::unique_ptr<int, D2> d2;
d2 = std::move(d1);
}
void
test02()
{
std::unique_ptr<int[], D1> d1;
std::unique_ptr<int[], D2> d2;
d2 = std::move(d1);
}
The constraints on the converting assignment operators incorrectly include this
constraint from the converting constructor:
— either D is a reference type and E is the same type as D, or D is not a
reference type and E is implicitly convertible to D.
This used to compile with GCC 5, until r226733.