[Bug libstdc++/87704] New: [6/7/8/9 Regression] unique_ptr<T>(nullptr_t) requires T to be complete
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Oct 23 11:20:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87704
Bug ID: 87704
Summary: [6/7/8/9 Regression] unique_ptr<T>(nullptr_t) requires
T to be complete
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Keywords: rejects-valid
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Target Milestone: ---
#include <memory>
struct Incomplete;
void f(void* p)
{
::new (p) std::unique_ptr<Incomplete>(); // OK
::new (p) std::unique_ptr<Incomplete>(nullptr); // ERROR
}
This fails because the unique_ptr(nullptr_t) constructor is implemented
precisely as specified in C++11 and C++14:
constexpr unique_ptr(nullptr_t) noexcept
: unique_ptr() { }
The use of a delegating constructor means that the destructor is odr-used which
invokes default_delete<T>::operator() which is ill-formed if T is incomplete.
The example compiled until r194651 but fails in all versions since 4.8.0
The same problem exists for the unique_ptr<T[], D> specialization, but not for
shared_ptr(nullptr) because that doesn't create a control block so doesn't
instantiate a deleter.
More information about the Gcc-bugs
mailing list