diff options
Diffstat (limited to 'gcc/ada/decl.c')
-rw-r--r-- | gcc/ada/decl.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/gcc/ada/decl.c b/gcc/ada/decl.c index 3d7c849fa71..4b3edce40a9 100644 --- a/gcc/ada/decl.c +++ b/gcc/ada/decl.c @@ -2762,9 +2762,14 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) gnu_field_type = TREE_TYPE (gnu_old_field); } - /* If this was a bitfield, get the size from the old field. - Also ensure the type can be placed into a bitfield. */ - else if (DECL_BIT_FIELD (gnu_old_field)) + /* If the old field was packed and of constant size, we + have to get the old size here, as it might differ from + what the Etype conveys and the latter might overlap + onto the following field. Try to arrange the type for + possible better packing along the way. */ + else if (DECL_PACKED (gnu_old_field) + && TREE_CODE (DECL_SIZE (gnu_old_field)) + == INTEGER_CST) { gnu_size = DECL_SIZE (gnu_old_field); if (TYPE_MODE (gnu_field_type) == BLKmode @@ -2789,7 +2794,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) gnu_field = create_field_decl (DECL_NAME (gnu_old_field), gnu_field_type, gnu_type, - 0, gnu_size, gnu_new_pos, + DECL_PACKED (gnu_old_field), gnu_size, gnu_new_pos, !DECL_NONADDRESSABLE_P (gnu_old_field)); if (!TREE_CONSTANT (gnu_pos)) |