From: Eric Botcazou Date: Wed, 16 Sep 2009 15:02:25 +0000 (+0000) Subject: trans.c (Attribute_to_gnu): Strip conversions between original and packable version... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=20faffe76f5c17d2f21a7946be0e19d0f4898b89;p=gcc.git trans.c (Attribute_to_gnu): Strip conversions between original and packable version of types from the... * gcc-interface/trans.c (Attribute_to_gnu) : Strip conversions between original and packable version of types from the expression. From-SVN: r151757 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 485562fb29b..dae5c00e6a3 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2009-09-16 Eric Botcazou + + * gcc-interface/trans.c (Attribute_to_gnu) : Strip + conversions between original and packable version of types from + the expression. + 2009-09-16 Eric Botcazou * gcc-interface/decl.c (gnat_to_gnu_field): Add DEBUG_INFO_P parameter. diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 5bce21a7063..a90a7a060bc 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -1279,9 +1279,16 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute) case Attr_Max_Size_In_Storage_Elements: gnu_expr = gnu_prefix; - /* Remove NOPs from GNU_EXPR and conversions from GNU_PREFIX. - We only use GNU_EXPR to see if a COMPONENT_REF was involved. */ - while (TREE_CODE (gnu_expr) == NOP_EXPR) + /* Remove NOPs and conversions between original and packable version + from GNU_EXPR, and conversions from GNU_PREFIX. We use GNU_EXPR + to see if a COMPONENT_REF was involved. */ + while (TREE_CODE (gnu_expr) == NOP_EXPR + || (TREE_CODE (gnu_expr) == VIEW_CONVERT_EXPR + && TREE_CODE (TREE_TYPE (gnu_expr)) == RECORD_TYPE + && TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_expr, 0))) + == RECORD_TYPE + && TYPE_NAME (TREE_TYPE (gnu_expr)) + == TYPE_NAME (TREE_TYPE (TREE_OPERAND (gnu_expr, 0))))) gnu_expr = TREE_OPERAND (gnu_expr, 0); gnu_prefix = remove_conversions (gnu_prefix, true); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ac05fd3a73f..e02dbf90d18 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-09-16 Eric Botcazou + + * gnat.dg/alignment9.adb: New test. + 2009-09-16 Eric Botcazou * gnat.dg/discr20.ad[sb]: New test. diff --git a/gcc/testsuite/gnat.dg/alignment9.adb b/gcc/testsuite/gnat.dg/alignment9.adb new file mode 100644 index 00000000000..ae7a7f67e9e --- /dev/null +++ b/gcc/testsuite/gnat.dg/alignment9.adb @@ -0,0 +1,30 @@ +-- { dg-do run } +-- { dg-options "-gnatws" } + +procedure Alignment9 is + + type Kind is (Small, Large); + for Kind'Size use 8; + + type Header is + record + K : Kind; + I : Integer; + end record; + + for Header use + record + K at 4 range 0..7; + I at 0 range 0..31; + end record; + + for Header'Size use 5*8; + for Header'Alignment use 1; + + H : Header; + +begin + if H'Size /= 40 then + raise Program_Error; + end if; +end;