https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71258
--- Comment #2 from Marc Glisse <glisse at gcc dot gnu.org> --- inline void* operator new(std::size_t n){return __builtin_malloc(n);} inline void operator delete(void*p, std::size_t){__builtin_free(p);} And we get: _5 = __builtin_malloc (16); MEM[(struct model *)_5].D.43852._vptr.concept = &MEM[(void *)&_ZTVN4poly5modelIiEE + 16B]; MEM[(struct model *)_5]._data = 40; poly::model<int>::~model (_5); return 42; So it isn't just that new/delete are not magic with gcc, we also fail to inline ~model here. Reminds me a bit of PR59948.