On Fri, Nov 18, 2022 at 4:26 AM apinski--- via Gcc-patches
wrote:
>
> From: Andrew Pinski
>
> 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 (_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 000..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 000..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 000..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
>