Hi!

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.

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

2026-06-09  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.

--- gcc/c/c-parser.cc.jj        2026-06-08 21:36:16.297191216 +0200
+++ gcc/c/c-parser.cc   2026-06-09 21:36:05.459979935 +0200
@@ -13564,6 +13564,11 @@ c_parser_postfix_expression (c_parser *p
            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))
              {
--- gcc/cp/typeck.cc.jj 2026-06-05 10:39:31.145265677 +0200
+++ gcc/cp/typeck.cc    2026-06-09 21:37:35.065826637 +0200
@@ -7126,6 +7126,8 @@ build_x_bswapg_bitreverseg (location_t l
       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);
--- gcc/testsuite/c-c++-common/builtin-bswapg-5.c.jj    2026-06-09 
21:41:02.785153105 +0200
+++ gcc/testsuite/c-c++-common/builtin-bswapg-5.c       2026-06-09 
21:40:59.064200998 +0200
@@ -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'" } */
+}
--- gcc/testsuite/c-c++-common/builtin-bitreverseg-4.c.jj       2026-06-09 
21:41:14.441003085 +0200
+++ gcc/testsuite/c-c++-common/builtin-bitreverseg-4.c  2026-06-09 
21:41:10.788050102 +0200
@@ -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'" } */
+}

        Jakub

Reply via email to