https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109215
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- This is complete mess. /* Describes a "special" array member for a COMPONENT_REF. */ enum struct special_array_member { none, /* Not a special array member. */ int_0, /* Interior array member with size zero. */ trail_0, /* Trailing array member with size zero. */ trail_1, /* Trailing array member with one element. */ trail_n, /* Trailing array member with two or more elements. */ int_n /* Interior array member with one or more elements. */ }; Why is this defined differently for _0 and _1? Because what is interior array with zero sized elements with 3 members? Both int_0 because the member has zero size, and int_n because it has one or more elements. I think we should make int_0/trail_0 mean with zero elements, anything else is inconsistent.