https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122496

--- Comment #1 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Qing Zhao <[email protected]>:

https://gcc.gnu.org/g:aa27219f9abdd8030fa38aae64c3a4d1231c73e8

commit r16-6784-gaa27219f9abdd8030fa38aae64c3a4d1231c73e8
Author: Qing Zhao <[email protected]>
Date:   Wed Jan 14 17:14:01 2026 +0000

    C: fix issues when supporting counted_by fields in anonymous
structure/unions [PR122495,PR122496]

    Currently, GCC does not fully support the cases when a FAM or pointer field
and
    its corresponding counted_by field are in different anonymous
structure/unions
    of a common named structure.

    For example:

    struct nested_mixed {
      struct {
        union {
          int b;
          float f;
        };
        int n;
      };
      struct {
        PTR_TYPE *pointer __attribute__((__counted_by__(n)));
        FAM_TYPE c[] __attribute__((__counted_by__(b)));
      };
    } *nested_mixed_annotated;

    In order to support such cases, we always need to locate the first outer
    named structure as the root, and then lookup_field inside this named
    structure. When building the component_ref for the counted_by field,
    we need to build a chain of component_ref starting from the root structure.

    When supporting the above in general, we also need to handle the following
    several special cases correctly:

    A. Support an untagged type as its own top-level type.  */
    struct { int a; char b[] __attribute__ ((counted_by (a))); } *x;

    B. Support an unnamed field with a named struct/union.  */
    struct s { struct { int a; char b[] __attribute__ ((counted_by (a))); } *x;
} *y;

    C. When -fms-extensions is enabled:

       C.1 Do not support the inward-to-outward counted-by field reference
           since checking the validity of such reference depends on unknown
           situation at the end of the structure definition.

    struct bar {
      char *buf __counted_by (n); /* { dg-error "attribute is not a field
declaration in the same structure as" } */
    };

       C.2 support the outward-to-inward counted-by field reference.

            PR C/122495
            PR C/122496

    gcc/c/ChangeLog:

            * c-decl.cc (grokfield): Call
verify_counted_by_for_top_anonymous_type
            for named field.
            (verify_counted_by_attribute): Change the prototype to a recursive
            routine.
            (verify_counted_by_for_top_anonymous_type): New routine.
            (finish_struct): Set C_TYPE_FIELDS_HAS_COUNTED_BY and call the
routine
            verify_counted_by_attribute only for named structure.
            * c-parser.cc (c_parser_declaration_or_fndef): Call
            verify_counted_by_for_top_anonymous_type for the decl.
            (c_parser_parameter_declaration): Call
            verify_counted_by_for_top_anonymous_type for the parameter.
            (c_parser_type_name): Call verify_counted_by_for_top_anonymous_type
            for the type.
            * c-tree.h (C_TYPE_FIELDS_HAS_COUNTED_BY): New flag.
            (verify_counted_by_for_top_anonymous_type): New routine.
            * c-typeck.cc (build_counted_by_ref): Locate the root named
structure,
            build a chain of component_ref starting from the root structure.

    gcc/testsuite/ChangeLog:

            * gcc.dg/counted-by-anonymous-2-char.c: New test.
            * gcc.dg/counted-by-anonymous-2-float.c: New test.
            * gcc.dg/counted-by-anonymous-2-struct.c: New test.
            * gcc.dg/counted-by-anonymous-2-union.c: New test.
            * gcc.dg/counted-by-anonymous-2.c: New test.
            * gcc.dg/counted-by-anonymous-3.c: New test.
            * gcc.dg/counted-by-anonymous.c: New test.
            * gcc.dg/ubsan/counted-by-anonymous-bounds-1.c: New test.
            * gcc.dg/ubsan/counted-by-anonymous-bounds-2.c: New test.
            * gcc.dg/ubsan/counted-by-anonymous-bounds.c: New test.

Reply via email to