> On Mar 13, 2025, at 12:29, Martin Uecker <uec...@tugraz.at> wrote:
> 
> Am Donnerstag, dem 13.03.2025 um 15:41 +0000 schrieb Qing Zhao:
>> 
>>> On Mar 12, 2025, at 12:40, Martin Uecker <uec...@tugraz.at> wrote:
>>> 
>>> Am Mittwoch, dem 12.03.2025 um 16:20 +0000 schrieb Qing Zhao:
>>>> 
>>>>> On Mar 10, 2025, at 15:34, Martin Uecker <uec...@tugraz.at> wrote:
>>>>> 
>>>>> Am Montag, dem 10.03.2025 um 15:00 -0400 schrieb John McCall:
>>>>>> 
>>>>> 
>>>>> ...
>>>>> 
>>>>>> That said, my preference is still to just give preference to the field 
>>>>>> name,
>>>>>> which sidesteps any need for disambiguation syntax and avoids this whole
>>>>>> problem where structs can be broken by just adding a global variable that
>>>>>> happens to collide with a field.
>>>>> 
>>>>> I don't think it is a good idea when the 'n' in 'buf' refers to the
>>>>> previous global 'n' coming before and the 'n' in attribute 
>>>>> refers to a member 'n' coming later in the following example.
>>>>> 
>>>>> constexpr int n = 1;
>>>>> 
>>>>> struct foo {
>>>>> char *p [[gnu::counted_by(n)]];
>>>>> char buf[n];
>>>>> int n;
>>>>> };
>>>>> 
>>>>> How are you going to explain this to anyone?
>>>>> 
>>>>> 
>>>>> And neither global names nor struct members may always be under
>>>>> the control of the programmer.  Also that simply bringing
>>>>> a new identifier into scope can break code elsewhere worries me.
>>>>> 
>>>>> 
>>>>> Finally, the following does not even compile in C++.
>>>>> 
>>>>> struct foo {
>>>>> char buf[n];
>>>>> const static int n = 2;
>>>>> };
>>>>> 
>>>>> While the next example is also ok in C++.
>>>>> 
>>>>> constexpr int n = 2;
>>>>> 
>>>>> struct foo {
>>>>> char buf[n];
>>>>> };
>>>>> 
>>>>> With both declarations of 'n' the example has UB in C++. 
>>>>> So I am not convinced the proposed rules make a lot
>>>>> of sense for C++ either.
>>>>> 
>>>>> 
>>>>> Disambiguation with '__self__.'  completely avoids all these issues
>>>>> while keeping the door open for later improvements.  
>>>>> 
>>>>> I still think one could use designator syntax, i.e. '.n', which
>>>>> would be clearer and intuitive for both C and C++ programmers.
>>>> 
>>>> I think the major reason to use __self.n instead of .n is:
>>>> 
>>>> The dot (.) operator, i.e., the member access operator in C, is used to 
>>>> access the member of an _instance_ of 
>>>> a structure/union.
>>>> We should declare a variable with a structure type first, and then append 
>>>> this member access operator to this 
>>>> variable and followed by the member name to access the member, and then 
>>>> use it in the expressions.
>>> 
>>> For a designator
>>> 
>>> struct foo { int n; } a = { .n = 1 };
>>> 
>>> we also refer to a member 'n' of an instance 'a' of a structure type.
>>> The instance is simply implied by the context.
>>> 
>>> For 
>>> 
>>> struct foo { int n; char *x __counted_by(.n) };
>>> 
>>> is also refers to a member of an instance of the struct. The
>>> instance is the 'a' which is later used in an expression 'a.x'
>>> So the instance would again be implied by the context.
>>> 
>>> So for me this makes perfect sense in both cases (and
>>> for both C and C++)
>> 
>> Why does ‘.n' also make sense in C++?
> 
> For my perspective, it makes sense because C++ also already
> uses this syntax of designators, so this syntax should already be
> familiar to C++ programmers just like it is for C programmers: 
> https://godbolt.org/z/7saEofhEb

Okay. Make sense to me too. -:)

> 
> It would also disambiguate the name lookup just as it does in C.
> 
> So it seems to be a possible way forward while avoiding
> language divergence and without introducing anything too novel
> in either language.

Yes, I agree.  This looks like a good compromise between two languages. 
> 
> (But others still have concerns about .n and prefer __self__.)

Yeah, need to think about this a little more.

Qing


> 
> Martin
> 
> 
> 

Reply via email to