https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108619
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|unassigned at gcc dot gnu.org |redi at gcc dot gnu.org --- Comment #12 from Jonathan Wakely <redi at gcc dot gnu.org> --- This fails for all modes from C++11 to C++20: #include <memory> #include <vector> #include <type_traits> class a { ~a() = default; friend class b; }; class b { template<typename C> struct alloc { std::allocator<C> a; alloc() { } template<typename U> alloc(const alloc<U>&) { } using value_type = C; C* allocate(std::size_t n) { return a.allocate(n); } void deallocate(C* p, std::size_t n) { return a.deallocate(p, n); } template<typename U> void destroy(U* p){ if constexpr (std::is_array_v<U>){ for(auto& elem : *p){ (destroy)(std::addressof(elem)); } } else { p->~U(); } } }; std::vector<a,alloc<a>> v; public: void f(){ v.emplace_back(); } }; I have a patch ...