On Wed, Sep 11, 2024 at 09:13:40PM +0000, Qing Zhao wrote: > @@ -11741,6 +11770,55 @@ c_parser_postfix_expression (c_parser *parser) > set_c_expr_source_range (&expr, loc, close_paren_loc); > break; > } > + case RID_BUILTIN_COUNTED_BY_REF: > + { > + vec<c_expr_t, va_gc> *cexpr_list; > + c_expr_t *e_p; > + location_t close_paren_loc; > + > + in_builtin_counted_by_ref++;
I think this in_builtin_counted_by_ref stuff here plus the whole c-typeck.cc hunk should be replaced with: > + c_parser_consume_token (parser); > + if (!c_parser_get_builtin_args (parser, > + "__builtin_counted_by_ref", > + &cexpr_list, false, > + &close_paren_loc)) > + { > + expr.set_error (); > + in_builtin_counted_by_ref--; > + break; > + } > + if (vec_safe_length (cexpr_list) != 1) > + { > + error_at (loc, "wrong number of arguments to " > + "%<__builtin_counted_by_ref%>"); > + expr.set_error (); > + in_builtin_counted_by_ref--; > + break; > + } > + > + e_p = &(*cexpr_list)[0]; > + > + if (TREE_CODE (TREE_TYPE (e_p->value)) != ARRAY_TYPE) > + { > + error_at (loc, "the argument must be an array" > + "%<__builtin_counted_by_ref%>"); > + expr.set_error (); > + in_builtin_counted_by_ref--; > + break; > + } > + if (has_counted_by_object (e_p->value)) expr.value = get_counted_by_ref (e_p->value); else if (in_typeof && TREE_CODE (e_p->value) == COMPONENT_REF) { tree counted_by_type = NULL_TREE; tree arg = (*cexpr_ if (build_counted_by_ref (TREE_OPERAND (e_p->value, 0), TREE_OPERAND (e_p->value, 1), &counted_by_type)) expr.value = build_zero_cst (build_pointer_type (counted_by_type)); else expr.value = null_pointer_node; } else expr.value = null_pointer_node; (plus make build_counted_by_ref non-static and add prototype). Completely untested. > + if (has_counted_by_object ((*cexpr_list)[0].value)) > + expr.value > + = get_counted_by_ref ((*cexpr_list)[0].value); > + else > + expr.value > + = build_int_cst (build_pointer_type (void_type_node), 0); Jakub