https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896
--- Comment #15 from Martin Uecker <muecker at gwdg dot de> --- Am Freitag, dem 03.03.2023 um 20:27 +0000 schrieb isanbard at gmail dot com: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896 > > --- Comment #14 from Bill Wendling <isanbard at gmail dot com> --- > (In reply to Martin Uecker from comment #9) > > > > Considering that the GNU extensions is rarely used, one could consider > > > > redefining the meaning of > > > > > > > > int n = 1; > > > > struct { > > > > int n; > > > > char buf[n]; > > > > }; > > > > > > > > so that the 'n' refers to the member. Or we add a new syntax similar to > > > > designators (which intuitively makes sense to me). > > > designator might be better IMO. > > > > > > a question here is: > > > > > > for the following nested structure: > > > > > > struct object { > > > ... > > > char items; > > > ... > > > struct inner { > > > ... > > > int flex[]; > > > }; > > > } *ptr; > > > > > > what kind of syntax is good to represent the upper bound of "flex" in the > > > inner > > > struct with "items" in the outer structure? any suggestion? > > > > I would disallow it. At least at first. It also raises some > > questions: For example, one could form a pointer to the inner > > struct, and then it is not clear how 'items' could be accessed > > anymore. > > > > That would be limiting its use in the Linux kernel. It seems that there are > ways to refer to struct members already using something like "offsetof": > > struct object { > ... > char items; > ... > struct inner { > ... > int flex[] __attribute__((__element_count__(offsetof(struct object, > items)))); > }; > } *ptr; This seems to be something completely different. offsetof computes the offset from the type given in its argument. But it would not access the value of the member of the enclosing struct. But it would not work in your example, because the struct object is incomplete at this point. So no, you can not use offsetof to reference a member of an enclosing struct. > > The object referenced by "offsetof" would be from the containing structure > (see > "container_of" macro in Linux). > > It has the benefit of not needing to extend C's syntax to allow for designated > initializers outside of initialization lists. Yes, but that syntax would be intuitive which I would see as an advantage. But I am not saying we shouldn't have the attribute first. > It also has the benefit of > allowing one to reference a variable not in the structure: > > const int items; > struct object { > ... > char items; > ... > struct inner { > ... > int flex[] __attribute__((__element_count__(items))); /* References > global "items" */ > }; > } *ptr; Whether you allow this or not has nothing to do with the syntax. The question is what semantics you attach to this and this is also a question in your example. If you define struct inner* a = ... What does it say for a->flex ? Martin >