https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99845
--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> --- Reduced: namespace std { using size_t = decltype(sizeof(0)); struct nothrow_t { } const nothrow = { }; } void* operator new(std::size_t); void* operator new[](std::size_t); void operator delete(void*) noexcept; void operator delete[](void*) noexcept; void operator delete(void*, std::size_t) noexcept; void operator delete[](void*, std::size_t) noexcept; void* operator new(std::size_t, const std::nothrow_t&) noexcept; void* operator new[](std::size_t, const std::nothrow_t&) noexcept; void operator delete(void*, const std::nothrow_t&) noexcept; void operator delete[](void*, const std::nothrow_t&) noexcept; extern "C" int printf(const char* ...); using std::size_t; struct X { void* operator new[](size_t sz, const std::nothrow_t& nt) { return ::operator new(sz, nt); } unsigned data = 0; }; struct Y { static X* alloc(unsigned n) { return new(std::nothrow) X[n]; } }; int main() { Y::alloc(-1u); }