https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102514
--- Comment #2 from jim x <xmh970252187 at gmail dot com> --- It seems that they all do not obey [expr.new] p9, which says that If the expression in a noptr-new-declarator is present, it is implicitly converted to std::size_t. The expression is erroneous if: - the expression is of non-class type and its value before converting to std::size_t is less than zero; - [...] If the expression is erroneous after converting to std::size_t: - if the expression is a core constant expression, the program is ill-formed; - otherwise, an allocation function is not called; instead - if the allocation function that would have been called has a non-throwing exception specification ([except.spec]), the value of the new-expression is the null pointer value of the required result type; - otherwise, the new-expression terminates by throwing an exception of a type that would match a handler ([except.handle]) of type std::bad_array_new_ length.