From: Roger Sayle Date: Thu, 10 Mar 2022 23:49:15 +0000 (+0000) Subject: PR c++/84964: Middle-end patch to expand_call for ICE after sorry. X-Git-Tag: basepoints/gcc-13~706 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a717376e99fb33ba3b06bd8122e884f4b63a60c9;p=thirdparty%2Fgcc.git PR c++/84964: Middle-end patch to expand_call for ICE after sorry. This patch resolves PR c++/84969 which is an ICE in the middle-end after emitting a "sorry, unimplemented" message, and is a regression from earlier releases of GCC. This issue is that after encountering a function call requiring an unreasonable amount of stack space, the code continues and falls foul of an assert checking that stack pointer has been correctly updated. The fix is to (locally) consider aborted function calls as "no return", which skips this downstream sanity check. 2022-03-10 Roger Sayle gcc/ChangeLog PR c++/84964 * calls.cc (expand_call): Ignore stack adjustments after sorry. gcc/testsuite/ChangeLog PR c++/84964 * g++.dg/other/pr84964.C: New test case. --- diff --git a/gcc/calls.cc b/gcc/calls.cc index 58864d0fdb33..50fa7b8e3500 100644 --- a/gcc/calls.cc +++ b/gcc/calls.cc @@ -3447,6 +3447,8 @@ expand_call (tree exp, rtx target, int ignore) >= (1 << (HOST_BITS_PER_INT - 2))) { sorry ("passing too large argument on stack"); + /* Don't worry about stack clean-up. */ + flags |= ECF_NORETURN; continue; } diff --git a/gcc/testsuite/g++.dg/other/pr84964.C b/gcc/testsuite/g++.dg/other/pr84964.C new file mode 100644 index 000000000000..0f2f6f3e6292 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr84964.C @@ -0,0 +1,7 @@ +/* { dg-do compile } */ + +struct a { + short b : -1ULL; // { dg-warning "exceeds its type" } +}; +void c(...) { c(a()); } // { dg-message "sorry, unimplemented" } +