Hi!

The following testcase ICEs, because we never call c_fully_fold on the
argument.
Fixed by calling it before calling fold_build_builtin_bswapg_bitreverseg
which creates the builtin or IFN calls.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2026-06-07  Jakub Jelinek  <[email protected]>

        PR c/125629
        * c-parser.cc (c_parser_postfix_expression) <case RID_BUILTIN_BSWAPG>:
        Call c_fully_fold on the argument before calling
        fold_build_builtin_bswapg_bitreverseg.

        * c-c++-common/builtin-bswapg-4.c: New test.
        * c-c++-common/builtin-bitreverseg-3.c: New test.

--- gcc/c/c-parser.cc.jj        2026-06-05 10:39:31.137483561 +0200
+++ gcc/c/c-parser.cc   2026-06-06 10:52:33.782972289 +0200
@@ -13600,6 +13600,7 @@ c_parser_postfix_expression (c_parser *p
                expr.set_error ();
                break;
              }
+           arg = c_fully_fold (arg, false, NULL);
            expr.value = fold_build_builtin_bswapg_bitreverseg (loc, ifn, arg);
            set_c_expr_source_range (&expr, loc, close_paren_loc);
            break;
--- gcc/testsuite/c-c++-common/builtin-bswapg-4.c.jj    2026-06-06 
10:58:03.991565616 +0200
+++ gcc/testsuite/c-c++-common/builtin-bswapg-4.c       2026-06-06 
10:58:10.994472162 +0200
@@ -0,0 +1,10 @@
+/* PR c/125629 */
+/* { dg-do compile } */
+
+int c;
+
+unsigned
+foo ()
+{
+  return __builtin_bswapg (c ? : 0u);
+}
--- gcc/testsuite/c-c++-common/builtin-bitreverseg-3.c.jj       2026-06-06 
10:58:24.161296450 +0200
+++ gcc/testsuite/c-c++-common/builtin-bitreverseg-3.c  2026-06-06 
10:58:31.510198375 +0200
@@ -0,0 +1,10 @@
+/* PR c/125629 */
+/* { dg-do compile } */
+
+int c;
+
+unsigned
+foo ()
+{
+  return __builtin_bitreverseg (c ? : 0u);
+}

        Jakub

Reply via email to