https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99845
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Last reconfirmed| |2021-03-31 Status|UNCONFIRMED |NEW --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- allocbuf(uint32_t nelems) { return new(std::nothrow) T[static_cast<size_t>(nelems)]; } expands to <<cleanup_point return <retval> = TARGET_EXPR <D.7342, SAVE_EXPR <(sizetype) nelems> <= 1152921504606846975 ? (size_t) ((SAVE_EXPR <(sizetype) nelems> + 1) * 8) : (size_t) __cxa_throw_bad_array_new_length ()>;, TARGET_EXPR <D.7341, MyType::operator new [] (NON_LVALUE_EXPR <D.7342>, (const struct nothrow_t &) ¬hrow)>;;, *(sizetype *) NON_LVALUE_EXPR <D.7341> = SAVE_EXPR <(sizetype) nelems>;, try { ... which calls MyType::operator new[] and then stores 'nelems' at the beginning of the allocated storage for some reason (ABI?). That makes using new[] (std::nothrow) "unsafe" to call it seems?