Am Mittwoch, dem 12.11.2025 um 22:07 +0000 schrieb Joseph Myers:
> On Wed, 12 Nov 2025, Qing Zhao wrote:
>
> > > There are the various extensions (-fms-extensions / -fplan9-extensions)
> > > to
> > > consider as well, but it might be reasonable to say that only genuinely
> > > anonymous struct / union members get the special counted_by handling,
> >
> > So, in C FE, what’s the best way to determine whether the anonymous
> > struct/union is
> > genuine or not? (The DECL_CONTEXT of this anonymous structure/union is
> > NULL_TREE?)
>
> You can't tell until some time after the definition is complete, because
> you need to see whether the type is used as the type of an unnamed field
> (possibly with qualifiers).
>
> Maybe this suggests that, as in other cases, an anonymous structure or
> union involving counted_by should actually be required to be valid without
> reference to the containing struct or union after all - that's how things
> generally work with anonymous structs and unions. That is, it would be OK
> for an outer struct or union to have counted_by pointing to a count in an
> inner anonymous struct or union, but not vice versa.
Without -fms-extensions, anonymous structs are supported only
if they are defined inline. The following is rejected with
--pedantic-errors but even without it an access to .buf would
be rejected.
typedef struct { char *buf; } x_t;
struct foo {
int n;
x_t;
};
But if they are declined inline
struct foo {
int n;
struct { char *buf; };
};
In this, counted_by could be supported and you would need to check
for the field name to NULL_TREE, i.e. DECL_NAME (...) == NULL_TREE and
also c_type_tag (...) == NULL_TREE.
You would then check correctness of the attribute only when the parent
type is complete.
If we want to support counted_by in even more generic cases, I think
checking would need to deferred to declaration of variables, but
I am not sure this is a good idea.
Martin