33 lines
1.3 KiB
Diff
33 lines
1.3 KiB
Diff
diff -rupN gcc-8.2.0/gcc/stor-layout.c gcc-8.2.0-new/gcc/stor-layout.c
|
|
--- gcc-8.2.0/gcc/stor-layout.c 2018-02-28 18:17:29.000000000 +0100
|
|
+++ gcc-8.2.0-new/gcc/stor-layout.c 2018-09-05 13:08:01.467976189 +0200
|
|
@@ -1685,14 +1685,21 @@ place_field (record_layout_info rli, tre
|
|
{
|
|
rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, DECL_SIZE (field));
|
|
|
|
- /* If we ended a bitfield before the full length of the type then
|
|
- pad the struct out to the full length of the last type. */
|
|
- if ((DECL_CHAIN (field) == NULL
|
|
- || TREE_CODE (DECL_CHAIN (field)) != FIELD_DECL)
|
|
- && DECL_BIT_FIELD_TYPE (field)
|
|
+ /* If FIELD is the last field and doesn't end at the full length
|
|
+ of the type then pad the struct out to the full length of the
|
|
+ last type. */
|
|
+ if (DECL_BIT_FIELD_TYPE (field)
|
|
&& !integer_zerop (DECL_SIZE (field)))
|
|
- rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos,
|
|
- bitsize_int (rli->remaining_in_alignment));
|
|
+ {
|
|
+ /* We have to scan, because non-field DECLS are also here. */
|
|
+ tree probe = field;
|
|
+ while ((probe = DECL_CHAIN (probe)))
|
|
+ if (TREE_CODE (probe) == FIELD_DECL)
|
|
+ break;
|
|
+ if (!probe)
|
|
+ rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos,
|
|
+ bitsize_int (rli->remaining_in_alignment));
|
|
+ }
|
|
|
|
normalize_rli (rli);
|
|
}
|