Am Donnerstag, dem 13.11.2025 um 15:44 +0000 schrieb Qing Zhao:
> 
> > 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);
>   }  
> }

Yes, I think this could be supported.
> 
> 
> > 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?

TYPE_NAME may also hold a typedef name.  This may or may not be
what you want.  If you want to resolved typedef names and get the tag,
you need to use c_type_tag.

> 
> > 
> > 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?

I was thinking about

struct bar {
    char *buf __counted_by(n);
};

struct foo {
  int n;
  struct bar;
};

which is allowed with -fms-extensions.

I don't think we should support this.

> 
> 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);
>   };
> };

I think this could be allowed because everythig is inline.

Martin 

> 
> 
> 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