On Fri, Nov 18, 2022 at 4:26 AM apinski--- via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > From: Andrew Pinski <apin...@marvell.com> > > 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.
OK. > 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 f06ce3cc77a..c62a966e918 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 > @@ -3709,6 +3711,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 00000000000..cc10685448b > --- /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 00000000000..07f52115ec8 > --- /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 00000000000..2f2a6548a57 > --- /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.17.1 >