Hi Jason! On 2025-03-20T11:52:46-0400, Jason Merrill <ja...@redhat.com> wrote: > On 3/19/25 1:35 PM, Thomas Schwinge wrote: >> On 2013-05-03T16:24:43-0400, Jason Merrill <ja...@redhat.com> wrote: >>> Last year Florian fixed the compiler to detect overflow in array new >>> size calculations and pass (size_t)-1 in that case. But C++11 specifies >>> that in case of overflow the program throws std::bad_array_new_length >>> (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#624), so >>> I've adjusted the checking code accordingly. >>> >>> This patch also adds the type to libsupc++, and several exports to >>> libstdc++. >>> >>> Tested x86_64-pc-linux-gnu, applying to trunk. >> >> Subversion r198731 (Git commit 7d5e76c8de1b6c4b2ae5576ab909dc9e580b216b). >> >>> Core 624/N2932: Throw bad_array_new_length on overflow >>> in array new size calculation. >>> >>> libstdc++-v3/ >>> * libsupc++/new: Add std::bad_array_new_length. >>> * libsupc++/bad_array_new.cc: New. >>> * libsupc++/eh_aux_runtime.cc: Add __cxa_bad_array_new_length. >>> * libsupc++/Makefile.in: Build them. >>> * config/abi/pre/gnu.ver: Add new symbols. >>> * config/abi/pre/gnu-versioned-namespace.ver: Add new symbols. >>> gcc/cp/ >>> * init.c (throw_bad_array_new_length): New. >>> (build_new_1): Use it. Don't warn about braced-init-list. >>> (build_vec_init): Use it. >>> * call.c (build_operator_new_call): Use it. >> >> Here: >> >>> --- a/gcc/cp/init.c >>> +++ b/gcc/cp/init.c >> >>> +/* Call __cxa_bad_array_new_length to indicate that the size calculation >>> + overflowed. Pretend it returns sizetype so that it plays nicely in the >>> + COND_EXPR. */ >>> + >>> +tree >>> +throw_bad_array_new_length (void) >>> +{ >>> + tree fn = get_identifier ("__cxa_bad_array_new_length"); >>> + if (!get_global_value_if_present (fn, &fn)) >>> + fn = push_throw_library_fn (fn, build_function_type_list (sizetype, >>> + NULL_TREE)); >>> + >>> + return build_cxx_call (fn, 0, NULL, tf_warning_or_error); >>> +} >> >> "Pretend it returns sizetype", doesn't work with nvptx, which complains >> that the front end-synthesized prototype with the fake 'sizetype' return >> type: >> >> .extern .func (.param .u64 %value_out) __cxa_throw_bad_array_new_length; >> >> ... doesn't match the library code with 'void' return type: >> >>> --- a/libstdc++-v3/libsupc++/cxxabi.h >>> +++ b/libstdc++-v3/libsupc++/cxxabi.h >> >>> + void >>> + __cxa_bad_array_new_length() __attribute__((__noreturn__)); >> >>> --- a/libstdc++-v3/libsupc++/eh_aux_runtime.cc >>> +++ b/libstdc++-v3/libsupc++/eh_aux_runtime.cc >> >>> +extern "C" void >>> +__cxxabiv1::__cxa_bad_array_new_length () >>> +{ _GLIBCXX_THROW_OR_ABORT(std::bad_array_new_length()); } >> >> .visible .func __cxa_throw_bad_array_new_length >> { >> [...] >> } >> >> ..., and thus results in execution test FAILs: >> >> error : Prototype doesn't match for >> '__cxa_throw_bad_array_new_length' in 'input file 5 at offset 14095', first >> defined in 'input file 5 at offset 14095' >> nvptx-run: cuLinkAddData failed: device kernel image is invalid >> (CUDA_ERROR_INVALID_SOURCE, 300) >> >> How can we improve on "Pretend it returns sizetype"? Is there a standard >> way to "bend" the types in the front end? > > Seems like we can just fix the return type, I don't see any regressions > from this:
Confirmed, thanks! Grüße Thomas > From cfc6e295ea19cb570c06d3281f41fd5ae0ba076b Mon Sep 17 00:00:00 2001 > From: Jason Merrill <ja...@redhat.com> > Date: Thu, 20 Mar 2025 09:55:40 -0400 > Subject: [PATCH] c++: fix return typye of __cxa_bad_array_new_length > To: gcc-patches@gcc.gnu.org > > We were lying about the return type, but that's not necessary; we already > need to handle a COND_EXPR where one side is void for THROW_EXPR. > > gcc/cp/ChangeLog: > > * init.cc (throw_bad_array_new_length): Returns void. > --- > gcc/cp/init.cc | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/gcc/cp/init.cc b/gcc/cp/init.cc > index ce6e58e05f2..e589e45e891 100644 > --- a/gcc/cp/init.cc > +++ b/gcc/cp/init.cc > @@ -2810,8 +2810,7 @@ diagnose_uninitialized_cst_or_ref_member (tree type, > bool using_new, bool compla > } > > /* Call __cxa_bad_array_new_length to indicate that the size calculation > - overflowed. Pretend it returns sizetype so that it plays nicely in the > - COND_EXPR. */ > + overflowed. */ > > tree > throw_bad_array_new_length (void) > @@ -2823,7 +2822,7 @@ throw_bad_array_new_length (void) > fn = get_global_binding (name); > if (!fn) > fn = push_throw_library_fn > - (name, build_function_type_list (sizetype, NULL_TREE)); > + (name, build_function_type_list (void_type_node, NULL_TREE)); > } > > return build_cxx_call (fn, 0, NULL, tf_warning_or_error); > -- > 2.48.1