> On Nov 13, 2025, at 01:32, Martin Uecker <[email protected]> wrote:
>
> 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; };
> };
>
You mean the following case:
struct foo {
Int n;
struct {
char *buf __counted_by (n);
}
}
> 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.
i.e, both the name of the field type and the name of the field are NULL_TREE?
>
> You would then check correctness of the attribute only when the parent
> type is complete.
Okay.
>
> If we want to support counted_by in even more generic cases,
What kind of more generic cases? Any example?
How about the following? Shall we support it?
struct nested_mixed {
struct {
union {
int b;
float f;
};
int n;
};
struct {
int *pointer __counted_by(n);
char c[] __counted_by(b);
};
};
Thanks a lot.
Qing
> I think
> checking would need to deferred to declaration of variables, but
> I am not sure this is a good idea.
>
> Martin