https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116529
--- Comment #7 from Jonathan Wakely <redi at gcc dot gnu.org> --- That's what this does: --- a/libstdc++-v3/include/bits/unique_ptr.h +++ b/libstdc++-v3/include/bits/unique_ptr.h @@ -379,8 +379,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" /// Converting constructor from @c auto_ptr - template<typename _Up, typename = _Require< - is_convertible<_Up*, _Tp*>, is_same<_Dp, default_delete<_Tp>>>> + template<typename _Up, + typename = _Require<is_convertible<_Up*, pointer>, + is_same<_Dp, default_delete<_Tp>>>> unique_ptr(auto_ptr<_Up>&& __u) noexcept; #pragma GCC diagnostic pop #endif This is equivalent, because when D must be default_delete<T>, pointer must be T*. But the ill-formed type now occurs during substitution.