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

commit r17-1480-gd172a9666d4281355786062dcc958a64e28a292c
Author: Jakub Jelinek <[email protected]>
Date:   Wed Jun 10 22:44:22 2026 +0200

    c, c++: Fix __builtin_{bswap,bitreverse}g error recovery [PR125694]
    
    The following invalid testcases ICE in both the C and C++ FEs.
    If arg is error_mark_node, TREE_TYPE works on it (and gives error_mark_node)
    but TYPE_MAIN_VARIANT on it is already invalid.
    
    The following patch fixes it in both spot by checking for error_operand_p
    before that.
    
    2026-06-10  Jakub Jelinek  <[email protected]>
    
            PR c/125694
            * c-parser.cc (c_parser_postfix_expression): If arg is
            error_operand_p, set error and break.
    
            * typeck.cc (build_x_bswapg_bitreverseg ): If arg is 
error_operand_p,
            return error_mark_node.
    
            * c-c++-common/builtin-bswapg-5.c: New test.
            * c-c++-common/builtin-bitreverseg-4.c: New test.
    
    Reviewed-by: Joseph Myers <[email protected]>
    Reviewed-by: Jason Merrill <[email protected]>

Diff:
---
 gcc/c/c-parser.cc                                  | 5 +++++
 gcc/cp/typeck.cc                                   | 2 ++
 gcc/testsuite/c-c++-common/builtin-bitreverseg-4.c | 8 ++++++++
 gcc/testsuite/c-c++-common/builtin-bswapg-5.c      | 8 ++++++++
 4 files changed, 23 insertions(+)

diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
index caef1ff55a0c..cf13bc2d7963 100644
--- a/gcc/c/c-parser.cc
+++ b/gcc/c/c-parser.cc
@@ -13564,6 +13564,11 @@ c_parser_postfix_expression (c_parser *parser)
            c_expr_t *arg_p = &(*cexpr_list)[0];
            *arg_p = convert_lvalue_to_rvalue (loc, *arg_p, true, true);
            tree arg = arg_p->value;
+           if (error_operand_p (arg))
+             {
+               expr.set_error ();
+               break;
+             }
            tree type = TYPE_MAIN_VARIANT (TREE_TYPE (arg));
            if (!INTEGRAL_TYPE_P (type))
              {
diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc
index 89795238057d..683457ccaf8c 100644
--- a/gcc/cp/typeck.cc
+++ b/gcc/cp/typeck.cc
@@ -7126,6 +7126,8 @@ build_x_bswapg_bitreverseg (location_t loc, internal_fn 
ifn,
       return error_mark_node;
     }
   tree arg = (*args)[0];
+  if (error_operand_p (arg))
+    return error_mark_node;
   if (type_dependent_expression_p (arg))
     {
       tree exp = build_min_nt_call_vec (NULL, args);
diff --git a/gcc/testsuite/c-c++-common/builtin-bitreverseg-4.c 
b/gcc/testsuite/c-c++-common/builtin-bitreverseg-4.c
new file mode 100644
index 000000000000..a12ec1c35888
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/builtin-bitreverseg-4.c
@@ -0,0 +1,8 @@
+/* PR c/125694 */
+/* { dg-do compile } */
+
+void
+foo ()
+{
+  __builtin_bitreverseg (__builtin_bitreverseg ());    /* { dg-error "wrong 
number of arguments to '__builtin_bitreverseg'" } */
+}
diff --git a/gcc/testsuite/c-c++-common/builtin-bswapg-5.c 
b/gcc/testsuite/c-c++-common/builtin-bswapg-5.c
new file mode 100644
index 000000000000..ecaf4a10fdbe
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/builtin-bswapg-5.c
@@ -0,0 +1,8 @@
+/* PR c/125694 */
+/* { dg-do compile } */
+
+void
+foo ()
+{
+  __builtin_bswapg (__builtin_bswapg ());              /* { dg-error "wrong 
number of arguments to '__builtin_bswapg'" } */
+}

Reply via email to