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); }
