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 >
