> On Sep 10, 2024, at 17:47, Jakub Jelinek <ja...@redhat.com> wrote:
> 
> On Tue, Sep 10, 2024 at 09:28:04PM +0000, Qing Zhao wrote:
>> @@ -11741,6 +11770,54 @@ 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 = true;
>> +
>> +    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 ();
>> + goto error_exit;
> 
> Up to Joseph or Marek as C maintainers/reviewers, but I think it is a bad
> idea to use such a generic name for a label inside of handling of one
> specific keyword.
> 
> Either use RAII and just break; instead of goto error_exit;, like
>    struct in_builtin_counted_by_ref_sentinel {
>      ~in_builtin_counted_by_ref_sentinel ()
>      { in_builtin_counted_by_ref = false; }
>    } ibcbr_sentinel;
> or add those in_builtin_counted_by_ref = false; lines before each break;

Okay, I can add in_builtin_counted_by_ref = false lines before each break.
 That might be the most simple and straightforward way to fix this concern. -:)

> 
> Or set it just when parsing the args?
> 
> Anyway, I'm not even convinced a global variable like that is a good idea.
> The argument can contain arbitrary expressions in there (e.g. comma
> expression, statement expression, ...), I strongly doubt you want to
> have that special handling in all the places in the grammar rather than just
> for the last COMPONENT_REF in there.  And, there is no reason why
> you couldn't have e.g. nested call inside of the argument:
> __builtin_counted_by_ref (ptr[*__builtin_counted_by_ref 
> (something->fam1)]->fam2)
> and that on the other side clears in_builtin_counted_by_ref after parsing
> the inner one.
Good point here. So, instead of of a boolean type, same as the other globals, 
such as
In_typeof, in_sizeof, use an int type  to record the level of the nesting might 
be more proper.

What’s your suggestion here?

thanks.

Qing
> 
> Jakub
> 

Reply via email to