]> gcc.gnu.org Git - gcc.git/commitdiff
PR c++/84964: Middle-end patch to expand_call for ICE after sorry.
authorRoger Sayle <roger@nextmovesoftware.com>
Thu, 10 Mar 2022 23:49:15 +0000 (23:49 +0000)
committerRoger Sayle <roger@nextmovesoftware.com>
Thu, 10 Mar 2022 23:49:15 +0000 (23:49 +0000)
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  <roger@nextmovesoftware.com>

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.

gcc/calls.cc
gcc/testsuite/g++.dg/other/pr84964.C [new file with mode: 0644]

index 58864d0fdb33feb2b22af185932d8fc881ded15d..50fa7b8e35007ca6a27aad67ef391b9a894aefb6 100644 (file)
@@ -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 (file)
index 0000000..0f2f6f3
--- /dev/null
@@ -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" }
+
This page took 0.064716 seconds and 5 git commands to generate.