Am Mittwoch, dem 22.01.2025 um 15:53 +0100 schrieb Michael Matz:
> 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".  

What I mean is that after parsing the dot followed by an identifier x, 
if x is the name of a member of the structure S which is being initialized,
it is  a designator, otherwise it is an expression that uses .x to refer
to some member of an enclosing definition.

So you do not need to look further.  But maybe I am missing something
else.

Martin


> 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.

-- 
Univ.-Prof. Dr. rer. nat. Martin Uecker
Graz University of Technology
Institute of Biomedical Imaging


Reply via email to