On Thu, Jun 30, 2022 at 03:31:00PM +0000, Qing Zhao wrote: > > No, that’s not true. A FIELD_DELC is only shared for cv variants of a > > structure. > > Sorry for my dump questions: > > 1. What do you mean by “cv variants” of a structure?
const/volatile qualified variants. So > 2. For the following example: > > struct AX { int n; short ax[];}; struct AX, const struct AX, volatile const struct AX etc. types will share the FIELD_DECLs. > struct UX {struct AX b; int m;}; > > Are there two different FIELD_DECLs in the IR, one for AX.ax, the other one > is for UX.b.ax? No, there are just n and ax FIELD_DECLs with DECL_CONTEXT of struct AX and b and m FIELD_DECLs with DECL_CONTEXT of struct UX. But, what is important is that when some FIELD_DECL is last in some structure and has array type, it doesn't mean it should have an unconstrained length. In the above case, when struct AX is is followed by some other member, it acts as a strict short ax[0]; field (even when that is an exception), one can tak address of &UX.b.ax[0], but can't dereference that, or &UX.b.ax[1]. I believe pedantically flexible array members in such cases don't necessarily mean zero length array, could be longer, e.g. for the usual x86_64 alignments struct BX { long long n; short o; short ax[]; }; struct VX { struct BX b; int m; }; I think it acts as short ax[3]; because the padding at the end of struct BX is so long that 3 short elements fit in there. While if one uses struct BX bx = { 1LL, 2, { 3, 4, 5, 6, 7, 8, 9, 10 } }; (a GNU extension), then it acts as short ax[11]; - the initializer is 8 elements and after short ax[8]; is padding for another 3 full elemenets. And of course: struct BX *p = malloc (offsetof (struct BX, ax) + n * sizeof (short)); means short ax[n]. Whether struct WX { struct BX b; }; struct WX *p = malloc (offsetof (struct WX, b.ax) + n * sizeof (short)); is pedantically acting as short ax[n]; is unclear to me, but we are generally allowing that and people expect it. Though, on the GCC side, I think we are only treating like flexible arrays what is really at the end of structs, not followed by other members. Jakub