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