https://gcc.gnu.org/g:7bd059e28dde475320ccfa07d94a14c8c65f8073

commit r16-7632-g7bd059e28dde475320ccfa07d94a14c8c65f8073
Author: Roger Sayle <[email protected]>
Date:   Sun Feb 22 22:32:05 2026 +0000

    PR c/123716: Fix an unexpected error_mark_node ICE.
    
    This patch resolves the P4 regression PR c/123716.
    
    2026-02-22  Roger Sayle  <[email protected]>
    
    gcc/ChangeLog
            PR c/123716
            * tree.cc (tree_nop_conversion_p): Move sanity checks on
            inner_type to here...
            (tree_nop_conversion): ... from here.
    
    gcc/testsuite/ChangeLog
            PR c/123716
            * gcc.dg/pr123716.c: New test case.

Diff:
---
 gcc/testsuite/gcc.dg/pr123716.c | 9 +++++++++
 gcc/tree.cc                     | 5 +++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/pr123716.c b/gcc/testsuite/gcc.dg/pr123716.c
new file mode 100644
index 000000000000..0ac34361e891
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr123716.c
@@ -0,0 +1,9 @@
+/* PR c/123716 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+int f(unsigned s)
+{
+  int i;
+  for (i = 0; i < s; ++i);
+  unsigned i[1];  /* { dg-error "conflicting type" } */
+}
diff --git a/gcc/tree.cc b/gcc/tree.cc
index 02f98f87003b..d0e745e8d281 100644
--- a/gcc/tree.cc
+++ b/gcc/tree.cc
@@ -12333,6 +12333,9 @@ block_ultimate_origin (const_tree block)
 bool
 tree_nop_conversion_p (const_tree outer_type, const_tree inner_type)
 {
+  if (!inner_type || inner_type == error_mark_node)
+    return false;
+
   /* Do not strip casts into or out of differing address spaces.  */
   if (POINTER_TYPE_P (outer_type)
       && TYPE_ADDR_SPACE (TREE_TYPE (outer_type)) != ADDR_SPACE_GENERIC)
@@ -12382,8 +12385,6 @@ tree_nop_conversion (const_tree exp)
 
   outer_type = TREE_TYPE (exp);
   inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
-  if (!inner_type || inner_type == error_mark_node)
-    return false;
 
   return tree_nop_conversion_p (outer_type, inner_type);
 }

Reply via email to