On Fri, Jan 23, 2026 at 12:06 AM Jakub Jelinek <[email protected]> wrote:
>
> Hi!
>
> To my surprise the C FE marks as builtin even a declaration which has 
> incorrect
> return type.  Normally gimple_builtin_call_types_compatible_p etc. will
> just punt in cases where the return type is wrong, but builtins.cc doesn't
> use that.  For e.g. the mathfn builtins like sqrt and many others, it will
> punt on weird return types, but for fold_builtin_abs it doesn't and happily
> tests TYPE_UNSIGNED on it and fold_convert the integral operand to it etc.,
> which ICEs if the return type is aggregate.
>
> The following patch fixes it by punting if type is not integral.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok.

>
> 2026-01-23  Jakub Jelinek  <[email protected]>
>
>         PR middle-end/123703
>         * builtins.cc (fold_builtin_abs): Return NULL_TREE if type is not
>         integral.
>
>         * gcc.c-torture/compile/pr123703.c: New test.
>
> --- gcc/builtins.cc.jj  2026-01-02 09:56:09.907340908 +0100
> +++ gcc/builtins.cc     2026-01-22 11:20:57.607868166 +0100
> @@ -9538,7 +9538,7 @@ fold_builtin_fabs (location_t loc, tree
>  static tree
>  fold_builtin_abs (location_t loc, tree arg, tree type)
>  {
> -  if (!validate_arg (arg, INTEGER_TYPE))
> +  if (!validate_arg (arg, INTEGER_TYPE) || !INTEGRAL_TYPE_P (type))
>      return NULL_TREE;
>
>    if (TYPE_UNSIGNED (type))
> --- gcc/testsuite/gcc.c-torture/compile/pr123703.c.jj   2026-01-22 
> 11:22:20.733473067 +0100
> +++ gcc/testsuite/gcc.c-torture/compile/pr123703.c      2026-01-22 
> 11:23:34.705231596 +0100
> @@ -0,0 +1,10 @@
> +/* PR middle-end/123703 */
> +
> +struct S { int a; };
> +struct S abs (int);
> +
> +struct S
> +bar (int j)
> +{
> +  return abs (j);
> +}
>
>         Jakub
>

Reply via email to