https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120353
--- Comment #1 from qinzhao at gcc dot gnu.org ---
in the routine "finish_struct" of c-decl.cc, we have:
9660 if (warn_flex_array_member_not_at_end
9661 && !is_last_field
9662 && RECORD_OR_UNION_TYPE_P (TREE_TYPE (x))
9663 && TYPE_INCLUDES_FLEXARRAY (TREE_TYPE (x)))
9664 warning_at (DECL_SOURCE_LOCATION (x),
9665 OPT_Wflex_array_member_not_at_end,
9666 "structure containing a flexible array member"
9667 " is not at the end of another structure");
when I debugged the small testing case in gdb in the above code, I observed
that:
when handling the field "x" in struct "Q", the TYPE_INCLUDES_FLEXARRAY
(TREE_TYPE (x))) is FALSE.
typedef struct X XX;
struct X {
int length;
int a[];
};
struct Q {
XX x;
int plug;
};
So, I suspect that the root cause is: the TYPE_INCLUDES_FLEXARRAY marking of
the struct X was not copied to its aliased type "XX".
need to figure out how to set the TYPE_INCLUDES_FLEXARRAY marking of XX
correctly based on "struct X"