Hello,

On Tue, 21 Jan 2025, Martin Uecker wrote:

> > > Coudn't you use the rule that .len refers to the closest enclosing 
> > > structure
> > > even without __self__ ?  This would then also disambiguate between 
> > > designators
> > > and other uses.
> > 
> > Right now, an expression cannot start with '.', which provides the 
> > disambiguation between designators and expressions as initializers. 
> 
> You could disambiguate directly after parsing the identifier, which
> does not seem overly problematic.

Which way?  When you allow ". identifier" as primary expression, then in

  struct S s = { .x = 42 };

the initializer can be parsed as designated initializer (with error 
when 'x' is not a member of S) or as assignment expression like in

  struct T t = { foo = 42 };

You need to decide which is which after seeing the ".".  I'm guessing what 
you mean is that on seeing ".ident" as first two tokens inside in 
initializer-list you go the designator route, and not the 
initializer/assignment-expression route, even though the latter can now 
also start with ".ident".  But then, what about:

  struct U u = { .y };

It's certainly not a designation anymore, but you only know after not 
seeing the '='.  So here it's actually an assignment-expression.  And as 
you allowed ".ident" as primary expression this might rightfully refer to 
some in-scope 'y' member of some outer struct (or give an error).

Note further that you may have '{ .y[1][3].z }', which is still not a 
designation, but an expression under your proposal, whereas
'{ .y[1][3].z = 1 }' would remain a designation.  This shows that you 
now need arbitrary look-ahead to disambiguate the two.  A Very Bad Idea.


Ciao,
Michael.

Reply via email to