From d9e161ce8f4097b04ab05121fed4f79c9bb609f6 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 8 Sep 2007 10:02:28 +0000 Subject: [PATCH] decl.c (make_packable_type): If the new type has been given BLKmode, try again to get an integral mode for it. * decl.c (make_packable_type): If the new type has been given BLKmode, try again to get an integral mode for it. From-SVN: r128266 --- gcc/ada/ChangeLog | 5 +++ gcc/ada/decl.c | 7 ++++ gcc/testsuite/ChangeLog | 4 +++ .../gnat.dg/unaligned_rep_clause.adb | 35 +++++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 gcc/testsuite/gnat.dg/unaligned_rep_clause.adb diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index b9e57dad694..e23d6b813c7 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2007-09-08 Eric Botcazou + + * decl.c (make_packable_type): If the new type has been given BLKmode, + try again to get an integral mode for it. + 2007-09-07 Eric Botcazou Re-apply accidentally reverted change: diff --git a/gcc/ada/decl.c b/gcc/ada/decl.c index c293cea068e..7a01327c865 100644 --- a/gcc/ada/decl.c +++ b/gcc/ada/decl.c @@ -5218,6 +5218,13 @@ make_packable_type (tree type) finish_record_type (new_type, nreverse (field_list), 1, true); copy_alias_set (new_type, type); + + /* Try harder to get a packable type if necessary, for example + in case the record itself contains a BLKmode field. */ + if (TYPE_MODE (new_type) == BLKmode) + TYPE_MODE (new_type) + = mode_for_size_tree (TYPE_SIZE (new_type), MODE_INT, 1); + return TYPE_MODE (new_type) == BLKmode ? type : new_type; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 71d7f211a96..dd0a5285570 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-09-08 Eric Botcazou + + * gnat.dg/unaligned_rep_clause.adb: New testcase. + 2007-09-08 Dorit Nuzman PR tree-optimization/33301 diff --git a/gcc/testsuite/gnat.dg/unaligned_rep_clause.adb b/gcc/testsuite/gnat.dg/unaligned_rep_clause.adb new file mode 100644 index 00000000000..b25c62ee9e7 --- /dev/null +++ b/gcc/testsuite/gnat.dg/unaligned_rep_clause.adb @@ -0,0 +1,35 @@ +procedure Unaligned_Rep_Clause is + + type One_Bit_Record is + record + B : Boolean; + end record; + Pragma Pack(One_Bit_Record); + + subtype Version_Number_Type is String (1 .. 3); + + type Inter is + record + Version : Version_Number_Type; + end record; + + type Msg_Type is + record + Status : One_Bit_Record; + Version : Inter; + end record; + + for Msg_Type use + record + Status at 0 range 0 .. 0; + Version at 0 range 1 .. 24; + end record; + for Msg_Type'Size use 25; + + Data : Msg_Type; + Pragma Warnings (Off, Data); + Version : Inter; + +begin + Version := Data.Version; +end; -- 2.30.2