https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82210
Aldy Hernandez <aldyh at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org, | |rguenth at gcc dot gnu.org --- Comment #4 from Aldy Hernandez <aldyh at gcc dot gnu.org> --- [Looping in the experts: Hi Jakub. Hi Richard.] Imagine this: struct big_container { __attribute__((aligned(16))) struct aa_container { short aa; } a[size]; int b[size]; } s; While laying out the type of big_container, and looking at field "a" in place_field() we get a DECL_SIZE_UNIT(a) of SAVE_EXPR <size> * 2 (courtesy of update_alignment_for_field). This size*2 is used in calculating the size of the record thus far: /* Now add size of this field to the size of the record. If the size is not constant, treat the field as being a multiple of bytes and just adjust the offset, resetting the bit position. ... else if (TREE_CODE (DECL_SIZE (field)) != INTEGER_CST || TREE_OVERFLOW (DECL_SIZE (field))) { rli->offset = size_binop (PLUS_EXPR, rli->offset, fold_convert (sizetype, size_binop (CEIL_DIV_EXPR, rli->bitpos, bitsize_unit_node))); rli->offset = size_binop (PLUS_EXPR, rli->offset, DECL_SIZE_UNIT (field)); rli->bitpos = bitsize_zero_node; rli->offset_align = MIN (rli->offset_align, desired_align); } (gdb) p debug_generic_stmt(rli.offset) (sizetype) SAVE_EXPR <size> * 2; Which means that when we call place_field(b), we think we have to start at size*2. Surely the start of field b should take into consideration the alignment of aa_container, no? Question: 1. Should DECL_SIZE_UNIT(a) include the size of the alignment padding? 2. Or, should the snippet above add the padding? Or, am I missing something? Thanks.