Hello,

On Fri, 4 Apr 2025, Qing Zhao wrote:

> A: 
> constexpr int len = 20;
> struct s {
>  int len;
>  int *buf __attribute__  ((counted_by (len))); // this continues to be member 
> ‘len’, not global ‘len'  
> };
> 
> B:
> constexpr int len = 20;
> struct s {
>  int len;
>  int *buf __attribute__ ((counted_by (len+0))); //this is an expression , 
> ‘len' refers to the global;
> };
> 
> When the parser is parsing the first identifier “len” inside the 
> counted_by attribute, it cannot decide which syntax to use yet, it must 
> look ahead at least one more word to decide, is this okay for the 
> current C parser?

As I understood Bills proposal (but see below) a full expression that 
isn't a lone identifier would always require the decl+expression syntax, 
so the above would lead to a syntax error and wouldn't require further 
look-ahead.  ('len' doesn't introduce a type, hence it can't be decl+expr, 
hence it must be lone-ident, which then generates the syntax error on 
seeing '+', after having successfully looked up 'len' among 
the struct members).

But I now realize that I may have misunderstood the proposal in the cace 
that the expression does not in fact contain references to any struct 
members, e.g.

  enum {FOO=42};
  struct s {
    int len;
    int *buf __attribute__((counted_by( /*???*/ FOO + 0))); // no use of len
  };

The proposal doesn't specifically talk about this case.  Clearly there is 
no need to locally declare anything (at ???), but that would have been the 
syntactic hint to differentiate between both branches in the proposal.  
So, ... hmm, that would seem to again introduce the ambiguity between 
'lone-ident' and 'expression'.  I'm not sure how Bill wants to handle 
that.  One could requre a useless dummy declaration, but that would be 
meh.


Ciao,
Michael.

Reply via email to