> 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


Reply via email to