summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/decl.c13
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/packed_subtype.adb24
4 files changed, 43 insertions, 4 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 6951351c64f..fca0cd0b9af 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-12 Olivier Hainque <hainque@adacore.com>
+
+ * decl.c (gnat_to_gnu_entity) <E_Record_Subtype>: For a subtype
+ with discriminant constraints, generalize the code for BIT_FIELDs
+ to PACKED fields of constant size and propagate DECL_PACKED.
+
2007-09-11 Eric Botcazou <ebotcazou@adacore.com>
* decl.c (array_type_has_nonaliased_component): New predicate.
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))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ddddf5987cb..f87c6a95ff7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2007-09-12 Olivier Hainque <hainque@adacore.com>
+
+ * gnat.dg/packed_subtype.adb: New test.
+
2007-09-12 Tobias Burnus <burnus@net-b.de>
PR fortran/33297
diff --git a/gcc/testsuite/gnat.dg/packed_subtype.adb b/gcc/testsuite/gnat.dg/packed_subtype.adb
new file mode 100644
index 00000000000..925440a41d8
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/packed_subtype.adb
@@ -0,0 +1,24 @@
+-- { dg-do run }
+
+procedure Packed_Subtype is
+
+ subtype Ubyte is Integer range 0 .. 255;
+ type Packet (Id : Ubyte) is record
+ A, B : Ubyte;
+ end record;
+ pragma Pack (Packet);
+
+ subtype My_Packet is Packet (Id => 1);
+
+ MP : My_Packet;
+begin
+ MP.A := 1;
+ MP.B := 2;
+
+ if MP.A /= 1 or else MP.B /= 2 then
+ raise Program_Error;
+ end if;
+end;
+
+
+