Hello,
On Mon, 14 Apr 2025, Bill Wendling wrote:
> Now, I don't think this will be necessarily confusing to the
> programmer, but it's inconsistent. In other words, either 'counted_by'
> *must* forward declare the in-structure identifier or neither must.
If that's your concern then both should require it, instead of neither,
because ...
> 1. The syntax needs to be unambiguous.
> 2. Identifier lookup must be consistent between the two attribute forms.
> 3. The common use case should take the least amount of code to write.
> (More of a "nice to have".)
>
> Therefore, I suggest the following rules, that are more-or-less the
> reverse of the current proposal's rules:
>
> - All untagged identifiers are assumed to be within the structure. If
> they aren't found in the struct, it's an error.
> - All globals (i.e. identifiers not in the struct) must be referenced
> via a special tag or a builtin (e.g. __builtin_global_ref()). The tag
> or builtin follow current scoping rules---i.e. it may pick up a shadow
> variable rather than the global.
... with that proposal, you're basically reverting back to the hack to
replicate the whole assignment-expression syntax tree down to
primary-expr just so that you can apply a special lookup rule for
the identifier->primary-expr production. And you're using that replicated
assignment-expression tree in just a single attribute. And to top it off
you then introduce another syntactic production to revert to the normal
lookup behaviour within the to-be-determined tag/builtin.
As discussed multiple times in this thread this syntax isn't unambiguous
(you need special wording and a new scoping rule on top of the syntax to
make it all unambigous). Even worse, under your new proposal this ...
> struct A {
> int *buf __counted_by(len); // 'len' *must* be in the struct.
> int len;
> };
... means that we would have to implement general delayed parsing for
expressions in C parsers. Doing that for a lone-ident only was always
meh, but somewhat acceptable. But the above means we have to do that
always for the new expr-within-counted syntax tree. That may be working
fantastically if you're hacking all this into a c++ parser, but for other
parsers that is something completely new.
I don't think this new proposal is new, it seems to be just the original
Apple variant at its core, with new non-general scoping rule, weird escape
mechanism, delayed parsing and basically everything that caused this long
thread.
Ciao,
Michael.