https://gcc.gnu.org/g:24dac1eab9c3b650826bbaa84dd64310910e647c

commit r15-5741-g24dac1eab9c3b650826bbaa84dd64310910e647c
Author: Joseph Myers <josmy...@redhat.com>
Date:   Thu Nov 28 02:41:35 2024 +0000

    c: Fix gimplification ICE for shifts with invalid redeclarations
    
    As reported in bug 117757, there is a C gimplification ICE for shifts
    involving a variable that was incompatibly redeclared (and thus had
    its type changed to error_mark_node).  Fix this with an appropriate
    error_operand_p check.
    
    Note that this is not the same issue as any of the other bugs reported
    for ICEs later in the gimplifier dealing with such erroneous
    redeclarations (it is, however, the same as the *second* ICE reported
    in bug 115644 - the test in comment#1 for that bug, not the one in the
    original bug report).
    
    Bootstrapped with no regressions for x86_64-pc-linux-gnu.
    
            PR c/117757
    
    gcc/c-family/
            * c-gimplify.cc (c_gimplify_expr): Check for error_operand_p
            before calling TYPE_MAIN_VARIANT for shifts.
    
    gcc/testsuite/
            * gcc.dg/pr117757-1.c: New test.

Diff:
---
 gcc/c-family/c-gimplify.cc        |  3 ++-
 gcc/testsuite/gcc.dg/pr117757-1.c | 10 ++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/gcc/c-family/c-gimplify.cc b/gcc/c-family/c-gimplify.cc
index 09ea1b791590..d4b97b4a9728 100644
--- a/gcc/c-family/c-gimplify.cc
+++ b/gcc/c-family/c-gimplify.cc
@@ -806,7 +806,8 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p 
ATTRIBUTE_UNUSED,
           We should get rid of this conversion when we have a proper
           type demotion/promotion pass.  */
        tree *op1_p = &TREE_OPERAND (*expr_p, 1);
-       if (!VECTOR_TYPE_P (TREE_TYPE (*op1_p))
+       if (!error_operand_p (*op1_p)
+           && !VECTOR_TYPE_P (TREE_TYPE (*op1_p))
            && !types_compatible_p (TYPE_MAIN_VARIANT (TREE_TYPE (*op1_p)),
                                    unsigned_type_node)
            && !types_compatible_p (TYPE_MAIN_VARIANT (TREE_TYPE (*op1_p)),
diff --git a/gcc/testsuite/gcc.dg/pr117757-1.c 
b/gcc/testsuite/gcc.dg/pr117757-1.c
new file mode 100644
index 000000000000..238b6db42bf5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr117757-1.c
@@ -0,0 +1,10 @@
+/* Test ICE for shift with invalid redeclaration (bug 117757).  */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void
+f (int a)
+{
+  1 << a;
+  int a[1]; /* { dg-error "redeclared" } */
+}

Reply via email to