On Tue, Apr 30, 2024 at 1:06 AM Roger Sayle <ro...@nextmovesoftware.com> wrote:
>
>
> This patch solves another ICE-after-error problem in the C family
> front-ends.  Upon a conflicting type redeclaration, the ambiguous
> type is poisoned with an error_mark_node to indicate to the middle-end
> that the type is suspect, but care has to be taken by the front-end to
> avoid passing these malformed trees into the middle-end during error
> recovery. In this case, a var_decl with a poisoned type appears within
> a sizeof() expression (wrapped in NOP_EXPR) which causes problems.
>
> This revision of the patch tests seen_error() to avoid tree traversal
> (STRIP_NOPs) in the most common case that an error hasn't occurred.
> Both this version (and an earlier revision that didn't test seen_error)
> have survived bootstrap and regression testing on x86_64-pc-linux-gnu.
> As a consolation, this code also contains a minor performance improvement,
> by avoiding trying to create (and folding away) a CEIL_DIV_EXPR in the
> common case that "char" is a single-byte.  The current code relies on
> the middle-end's tree folding to recognize that CEIL_DIV_EXPR of
> integer_one_node is a no-op, that can be optimized away.
>
> Ok for mainline?

Where does it end up ICEing?  I see size_binop_loc guards against
error_mark_node operands already, maybe it should use
error_operand_p instead?

>
> 2024-04-30  Roger Sayle  <ro...@nextmovesoftware.com>
>
> gcc/c-family/ChangeLog
>         PR c/109618
>         * c-common.cc (c_sizeof_or_alignof_type): If seen_error() check
>         whether value is (a VAR_DECL) of type error_mark_node, or a
>         NOP_EXPR thereof.  Avoid folding CEIL_DIV_EXPR for the common
>         case where char_type is a single byte.
>
> gcc/testsuite/ChangeLog
>         PR c/109618
>         * gcc.dg/pr109618.c: New test case.
>
>
> Thanks in advance,
> Roger
> --
>

Reply via email to