https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99934
Bug ID: 99934 Summary: bad_array_new_length thrown when non-throwing allocation function would have been used Product: gcc Version: 11.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- Reduced from Bug 99845 comment 11: namespace std { using size_t = decltype(sizeof(0)); } extern "C" void abort(); extern "C" int puts(const char*); struct X { void* operator new[](std::size_t) noexcept { puts("should not be here"); abort(); return nullptr; } int data; }; int main() { int n = -1; auto p = new X[n]; if (p) abort(); } This terminates with: terminate called after throwing an instance of 'std::bad_array_new_length' what(): std::bad_array_new_length Aborted (core dumped) The new-expression is erroneous (it has non-class type and its value before converting to std::size_t is less than zero), the allocation function that would be called is non-throwing, therefore the value of the new-expression should be (X*)nullptr instead of throwing bad_array_new_length. This was changed by https://wg21.link/cwg1992