Commit 09528ed9 by Olivier Hainque Committed by Olivier Hainque

decl.c (gnat_to_gnu_entity): For a subtype with discriminant constraints...

	2007-09-12  Olivier Hainque  <hainque@adacore.com>

	ada/
	* 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.

	testsuite/
	* gnat.dg/packed_subtype.adb: New test.

From-SVN: r128425
parent 7ab88654
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> 2007-09-11 Eric Botcazou <ebotcazou@adacore.com>
* decl.c (array_type_has_nonaliased_component): New predicate. * decl.c (array_type_has_nonaliased_component): New predicate.
...@@ -2762,9 +2762,14 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -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); gnu_field_type = TREE_TYPE (gnu_old_field);
} }
/* If this was a bitfield, get the size from the old field. /* If the old field was packed and of constant size, we
Also ensure the type can be placed into a bitfield. */ have to get the old size here, as it might differ from
else if (DECL_BIT_FIELD (gnu_old_field)) 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); gnu_size = DECL_SIZE (gnu_old_field);
if (TYPE_MODE (gnu_field_type) == BLKmode if (TYPE_MODE (gnu_field_type) == BLKmode
...@@ -2789,7 +2794,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -2789,7 +2794,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
gnu_field gnu_field
= create_field_decl = create_field_decl
(DECL_NAME (gnu_old_field), gnu_field_type, gnu_type, (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)); !DECL_NONADDRESSABLE_P (gnu_old_field));
if (!TREE_CONSTANT (gnu_pos)) if (!TREE_CONSTANT (gnu_pos))
......
2007-09-12 Olivier Hainque <hainque@adacore.com>
* gnat.dg/packed_subtype.adb: New test.
2007-09-12 Tobias Burnus <burnus@net-b.de> 2007-09-12 Tobias Burnus <burnus@net-b.de>
PR fortran/33297 PR fortran/33297
-- { 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment