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>
* 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)
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))
......
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
-- { 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