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.