> -----Original Message-----
> From: Andrew Pinski (QUIC) <quic_apin...@quicinc.com>
> Sent: Friday, March 22, 2024 10:50 PM
> To: gcc-patches@gcc.gnu.org
> Cc: Andrew Pinski (QUIC) <quic_apin...@quicinc.com>
> Subject: [PATCH] Another ICE after conflicting types of redeclaration
> [PR110682]
> 
> This another one of these ICE after error issues with the gimplifier and a 
> fallout
> from r12-3278-g823685221de986af.
> The problem here is that STRIP_USELESS_TYPE_CONVERSION will leave
> around a NON_LVALUE_EXPR which is an error mark node.
> Since the gimplifier assumes non-lvalue expressions has been removed, there
> was an ICE.
> 
> This fixes the issue by checking if there is a NON_LVALUE_EXPR and that has an
> error operand, we handle it as the same as if it was an error operand.


Ping?

Thanks,
Andrew


> 
> gcc/ChangeLog:
> 
>       PR c/110682
>       * gimplify.cc (gimplify_expr): Add check if there is
>       a non-lvalue with an error operand.
> 
> gcc/testsuite/ChangeLog:
> 
>       PR c/110682
>       * gcc.dg/redecl-27.c: New test.
> 
> Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> ---
>  gcc/gimplify.cc                  |  6 +++++-
>  gcc/testsuite/gcc.dg/redecl-27.c | 14 ++++++++++++++
>  2 files changed, 19 insertions(+), 1 deletion(-)  create mode 100644
> gcc/testsuite/gcc.dg/redecl-27.c
> 
> diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc index d64bbf3ffbd..001b4af68b9
> 100644
> --- a/gcc/gimplify.cc
> +++ b/gcc/gimplify.cc
> @@ -17686,7 +17686,11 @@ gimplify_expr (tree *expr_p, gimple_seq
> *pre_p, gimple_seq *post_p,
>        save_expr = *expr_p;
> 
>        /* Die, die, die, my darling.  */
> -      if (error_operand_p (save_expr))
> +      if (error_operand_p (save_expr)
> +       /* The above strip useless type conversion might not strip out
> +          a conversion from an error so handle that case here.  */
> +       || (TREE_CODE (save_expr) == NON_LVALUE_EXPR
> +           && error_operand_p (TREE_OPERAND (save_expr, 0))))
>       {
>         ret = GS_ERROR;
>         break;
> diff --git a/gcc/testsuite/gcc.dg/redecl-27.c b/gcc/testsuite/gcc.dg/redecl-
> 27.c
> new file mode 100644
> index 00000000000..93f577e64ff
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/redecl-27.c
> @@ -0,0 +1,14 @@
> +/* We used to ICE while gimplifying the body of f
> +   due to a NON_LVALUE_EXPR still being there.
> +   PR c/110682*/
> +/* { dg-do compile } */
> +/* { dg-options "" } */
> +
> +struct a {
> +  const signed char b;
> +};
> +
> +void f(volatile struct a *c) { /* { dg-note "" } */
> +  c - 0 % c->b;
> +  struct a c = {1}; /* { dg-error "redeclared as different kind of
> +symbol" } */ }
> --
> 2.43.0

Reply via email to