https://gcc.gnu.org/g:ea962c82c1d886aea6ccee81c4ba3a4a3fb7ed85

commit r17-1430-gea962c82c1d886aea6ccee81c4ba3a4a3fb7ed85
Author: Jakub Jelinek <[email protected]>
Date:   Mon Jun 8 21:36:24 2026 +0200

    c: Fix up ICE with __builtin_{bswap,bitreverse}g [PR125629]
    
    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.
    
    2026-06-08  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.
    
    Reviewed-by: Marek Polacek <[email protected]>

Diff:
---
 gcc/c/c-parser.cc                                  |  1 +
 gcc/testsuite/c-c++-common/builtin-bitreverseg-3.c | 10 ++++++++++
 gcc/testsuite/c-c++-common/builtin-bswapg-4.c      | 10 ++++++++++
 3 files changed, 21 insertions(+)

diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
index d30b36619538..caef1ff55a0c 100644
--- a/gcc/c/c-parser.cc
+++ b/gcc/c/c-parser.cc
@@ -13600,6 +13600,7 @@ c_parser_postfix_expression (c_parser *parser)
                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;
diff --git a/gcc/testsuite/c-c++-common/builtin-bitreverseg-3.c 
b/gcc/testsuite/c-c++-common/builtin-bitreverseg-3.c
new file mode 100644
index 000000000000..a27c5a2b929f
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/builtin-bitreverseg-3.c
@@ -0,0 +1,10 @@
+/* PR c/125629 */
+/* { dg-do compile } */
+
+int c;
+
+unsigned
+foo ()
+{
+  return __builtin_bitreverseg (c ? : 0u);
+}
diff --git a/gcc/testsuite/c-c++-common/builtin-bswapg-4.c 
b/gcc/testsuite/c-c++-common/builtin-bswapg-4.c
new file mode 100644
index 000000000000..ee2808ef03b6
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/builtin-bswapg-4.c
@@ -0,0 +1,10 @@
+/* PR c/125629 */
+/* { dg-do compile } */
+
+int c;
+
+unsigned
+foo ()
+{
+  return __builtin_bswapg (c ? : 0u);
+}

Reply via email to