114 lines
3.4 KiB
Diff
114 lines
3.4 KiB
Diff
From 202ebc25e509ae0a2ac7d05c822cf6a8a817e49a Mon Sep 17 00:00:00 2001
|
|
From: Andrew Pinski <apinski@marvell.com>
|
|
Date: Thu, 17 Nov 2022 22:08:07 +0000
|
|
Subject: [PATCH 141/157] [Backport][SME] Fix PRs 106764, 106765, and 107307,
|
|
all ICE after invalid re-declaration
|
|
|
|
Reference: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=bd0c9d9e706adaeea0d96152daade0a6819a8715
|
|
|
|
The problem here is the gimplifier returns GS_ERROR but
|
|
in some cases we don't check that soon enough and try
|
|
to do other work which could crash.
|
|
So the fix in these two cases is to return GS_ERROR
|
|
early if the gimplify_* functions had return GS_ERROR.
|
|
|
|
OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
|
|
|
|
Thanks,
|
|
Andrew Pinski
|
|
|
|
gcc/ChangeLog:
|
|
|
|
PR c/106764
|
|
PR c/106765
|
|
PR c/107307
|
|
* gimplify.cc (gimplify_compound_lval): Return GS_ERROR
|
|
if gimplify_expr had return GS_ERROR.
|
|
(gimplify_call_expr): Likewise.
|
|
|
|
gcc/testsuite/ChangeLog:
|
|
|
|
PR c/106764
|
|
PR c/106765
|
|
PR c/107307
|
|
* gcc.dg/redecl-19.c: New test.
|
|
* gcc.dg/redecl-20.c: New test.
|
|
* gcc.dg/redecl-21.c: New test.
|
|
---
|
|
gcc/gimplify.cc | 5 +++++
|
|
gcc/testsuite/gcc.dg/redecl-19.c | 5 +++++
|
|
gcc/testsuite/gcc.dg/redecl-20.c | 9 +++++++++
|
|
gcc/testsuite/gcc.dg/redecl-21.c | 9 +++++++++
|
|
4 files changed, 28 insertions(+)
|
|
create mode 100644 gcc/testsuite/gcc.dg/redecl-19.c
|
|
create mode 100644 gcc/testsuite/gcc.dg/redecl-20.c
|
|
create mode 100644 gcc/testsuite/gcc.dg/redecl-21.c
|
|
|
|
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
|
|
index 91500e2fb..e9f527850 100644
|
|
--- a/gcc/gimplify.cc
|
|
+++ b/gcc/gimplify.cc
|
|
@@ -3272,6 +3272,8 @@ gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
|
|
tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval,
|
|
fallback | fb_lvalue);
|
|
ret = MIN (ret, tret);
|
|
+ if (ret == GS_ERROR)
|
|
+ return GS_ERROR;
|
|
|
|
/* Step 2a: if we have component references we do not support on
|
|
registers then make sure the base isn't a register. Of course
|
|
@@ -3664,6 +3666,9 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
|
|
ret = gimplify_expr (&CALL_EXPR_FN (*expr_p), pre_p, NULL,
|
|
is_gimple_call_addr, fb_rvalue);
|
|
|
|
+ if (ret == GS_ERROR)
|
|
+ return GS_ERROR;
|
|
+
|
|
nargs = call_expr_nargs (*expr_p);
|
|
|
|
/* Get argument types for verification. */
|
|
diff --git a/gcc/testsuite/gcc.dg/redecl-19.c b/gcc/testsuite/gcc.dg/redecl-19.c
|
|
new file mode 100644
|
|
index 000000000..cc1068544
|
|
--- /dev/null
|
|
+++ b/gcc/testsuite/gcc.dg/redecl-19.c
|
|
@@ -0,0 +1,5 @@
|
|
+/* We used to ICE in the gimplifier, PR 106764 */
|
|
+/* { dg-do compile } */
|
|
+/* { dg-options "-w" } */
|
|
+(*a)(); // { dg-note "" }
|
|
+b(){a()} a; // { dg-error "" }
|
|
diff --git a/gcc/testsuite/gcc.dg/redecl-20.c b/gcc/testsuite/gcc.dg/redecl-20.c
|
|
new file mode 100644
|
|
index 000000000..07f52115e
|
|
--- /dev/null
|
|
+++ b/gcc/testsuite/gcc.dg/redecl-20.c
|
|
@@ -0,0 +1,9 @@
|
|
+/* We used to ICE in the gimplifier, PR 107307 */
|
|
+// { dg-do compile }
|
|
+// { dg-options "-w" }
|
|
+void f ()
|
|
+{
|
|
+ const struct { int a[1]; } b; // { dg-note "" }
|
|
+ int *c = b.a;
|
|
+ int *b; // { dg-error "" }
|
|
+}
|
|
diff --git a/gcc/testsuite/gcc.dg/redecl-21.c b/gcc/testsuite/gcc.dg/redecl-21.c
|
|
new file mode 100644
|
|
index 000000000..2f2a6548a
|
|
--- /dev/null
|
|
+++ b/gcc/testsuite/gcc.dg/redecl-21.c
|
|
@@ -0,0 +1,9 @@
|
|
+/* We used to ICE in the gimplifier, PR 106765 */
|
|
+/* { dg-do compile } */
|
|
+/* { dg-options "-w" } */
|
|
+struct a {
|
|
+ int b
|
|
+} c() {
|
|
+ struct a a; // { dg-note "" }
|
|
+ a.b;
|
|
+ d a; // { dg-error "" }
|
|
--
|
|
2.33.0
|
|
|