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'" } */ +}
