> On Apr 4, 2025, at 13:09, Martin Uecker <uec...@tugraz.at> wrote:
> 
> Am Freitag, dem 04.04.2025 um 18:51 +0200 schrieb Michael Matz:
>> Hello,
>> 
>> On Fri, 4 Apr 2025, Qing Zhao wrote:
>> 
>>> So, a different attribute name “counted_by_exp” might be better?
>> 
>> I would prefer Martins empty-decl idea to that: "counted_by(;len+0)" 
>> (looks up 'len' normally, i.e. doesn't look into current struct).  It 
>> would naturally fit the either decl+expr or lone-ident parse.
>> It may look weird but empty declarations are okayish IMHO.
>> 
>> But overall: I just don't know, it all looks a bit unsexy, there only seem 
>> to be rocks and hard places :)
> 
> I would not worry about this case too much, because I do expect this
> to be a common use case anyway.  That it looks strange may even be
> an advantage here, as it alerts the reader that this is unusual.

This is an interesting point and also a good point. -:)

The other thought that bother me a little bit is:

For the same attribute, counted_by, is it strange to have two different looking 
up rules 
depending on the different number of arguments? 

Qing
> 
> Martin
> 
>> 
>> 
>> Ciao,
>> Michael.
>> 
>>> 
>>> Qing
>>> 
>>>> On Apr 4, 2025, at 11:55, Michael Matz <m...@suse.de> wrote:
>>>> 
>>>> 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