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.


Martin





Reply via email to