aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2009-09-16 15:02:25 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2009-09-16 15:02:25 +0000
commit20faffe76f5c17d2f21a7946be0e19d0f4898b89 (patch)
treea8492b49df136bd364c700bf2d8efd42ab2fc74c /gcc
parent721641c415fa5d97709ce25219c2d492e54d85d4 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/ada/gcc-interface/trans.c13
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/alignment9.adb30
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;