diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2009-09-16 15:02:25 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2009-09-16 15:02:25 +0000 |
commit | 20faffe76f5c17d2f21a7946be0e19d0f4898b89 (patch) | |
tree | a8492b49df136bd364c700bf2d8efd42ab2fc74c /gcc | |
parent | 721641c415fa5d97709ce25219c2d492e54d85d4 (diff) | |
download | gcc-20faffe76f5c17d2f21a7946be0e19d0f4898b89.zip gcc-20faffe76f5c17d2f21a7946be0e19d0f4898b89.tar.gz gcc-20faffe76f5c17d2f21a7946be0e19d0f4898b89.tar.bz2 |
trans.c (Attribute_to_gnu): Strip conversions between original and packable version of types from the...
* gcc-interface/trans.c (Attribute_to_gnu) <Attr_Size>: Strip
conversions between original and packable version of types from
the expression.
From-SVN: r151757
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/alignment9.adb | 30 |
4 files changed, 50 insertions, 3 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 485562f..dae5c00 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,11 @@ 2009-09-16 Eric Botcazou <ebotcazou@adacore.com> + * gcc-interface/trans.c (Attribute_to_gnu) <Attr_Size>: Strip + conversions between original and packable version of types from + the expression. + +2009-09-16 Eric Botcazou <ebotcazou@adacore.com> + * gcc-interface/decl.c (gnat_to_gnu_field): Add DEBUG_INFO_P parameter. If a padding type was made for the field, declare it. (components_to_record): Add DEBUG_INFO_P parameter. Adjust call diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 5bce21a..a90a7a0 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 ac05fd3..e02dbf9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2009-09-16 Eric Botcazou <ebotcazou@adacore.com> + * gnat.dg/alignment9.adb: New test. + +2009-09-16 Eric Botcazou <ebotcazou@adacore.com> + * gnat.dg/discr20.ad[sb]: New test. 2009-09-16 Richard Guenther <rguenther@suse.de> diff --git a/gcc/testsuite/gnat.dg/alignment9.adb b/gcc/testsuite/gnat.dg/alignment9.adb new file mode 100644 index 0000000..ae7a7f6 --- /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; |