On 12/12/2025 02.03, Sami Tolvanen wrote:
> On Thu, Dec 11, 2025 at 12:28 AM Dan Carpenter <[email protected]> 
> wrote:
>>
>> On Wed, Dec 10, 2025 at 02:29:45PM -0800, Luck, Tony wrote:
>>>> diff --git a/expand.c b/expand.c
>>>> index f14e7181..71221d35 100644
>>>> --- a/expand.c
>>>> +++ b/expand.c
>>>> @@ -535,6 +535,8 @@ static int expand_compare(struct expression *expr)
>>>>                     expr->taint = 0;
>>>>                     return 0;
>>>>             }
>>>> +           if (left->flags & CEF_ICE && right->flags & CEF_ICE)
>>>> +                   expr->flags |= CEF_SET_ICE;
>>>>             if (simplify_cmp_binop(expr, left->ctype))
>>>>                     return 0;
>>>>             if (simplify_float_cmp(expr, left->ctype))
>>
>> I'm not an expert in the C standard, but this feels correct to me.
> 
> It only fixes comparisons though, the problem still exists for other
> expressions. For example, while `_Static_assert(__builtin_strlen("")
> == 0);` works with this change,
> `_Static_assert(!__builtin_strlen(""));` still fails. Perhaps there's
> a better way to fix this than changing each expression expansion
> function to handle this flag?

Maybe the flag fix just needs to be applied to the evaluation? Other op
structs do the same. But Dan's patch did not implement evaluate. E.g.:

static struct symbol_op constant_p_op = {
        .evaluate = evaluate_to_int_const_expr,
        .expand = expand_constant_p
};


> 
> Sami

Reply via email to