utils.c (rest_of_record_type_compilation): When computing encodings for the component...
authorOlivier Hainque <hainque@adacore.com>
Fri, 13 Jun 2008 10:27:29 +0000 (10:27 +0000)
committerOlivier Hainque <hainque@gcc.gnu.org>
Fri, 13 Jun 2008 10:27:29 +0000 (10:27 +0000)
2008-06-13  Olivier Hainque  <hainque@adacore.com>

        * utils.c (rest_of_record_type_compilation): When computing
        encodings for the components of a variable size type, early
        strip conversions on the current position expression to make
        sure it's shape is visible.  Use remove_conversions for this
        purpose.

From-SVN: r136748

gcc/ada/ChangeLog
gcc/ada/utils.c

index 5b143ae820a26765c1a81f1148f71828bf5debc2..f0eb327e43dce9fede2b366f3b54429db23d52bb 100644 (file)
@@ -1,3 +1,11 @@
+2008-06-13  Olivier Hainque  <hainque@adacore.com>
+
+       * utils.c (rest_of_record_type_compilation): When computing
+       encodings for the components of a variable size type, early
+       strip conversions on the current position expression to make
+       sure it's shape is visible.  Use remove_conversions for this
+       purpose.
+
 2008-06-12  Eric Botcazou  <ebotcazou@adacore.com>
 
        * decl.c (gnat_to_gnu_entity) <E_Record_Subtype>: In the case of a
index d9a0e3aa61805bdbd4571f5709b1b48780ae3ac4..f255d37d6efa0ee9755da13b3118792a61a39dd2 100644 (file)
@@ -1085,6 +1085,10 @@ rest_of_record_type_compilation (tree record_type)
 
          If this is a union, the position can be taken as zero. */
 
+         /* Some computations depend on the shape of the position expression,
+            so strip conversions to make sure it's exposed.  */
+         curpos = remove_conversions (curpos, true);
+
          if (TREE_CODE (new_record_type) == UNION_TYPE)
            pos = bitsize_zero_node, align = 0;
          else
@@ -1096,13 +1100,9 @@ rest_of_record_type_compilation (tree record_type)
              tree offset = TREE_OPERAND (curpos, 0);
              align = tree_low_cst (TREE_OPERAND (curpos, 1), 1);
 
-             /* Strip off any conversions.  */
-             while (TREE_CODE (offset) == NON_LVALUE_EXPR
-                    || CONVERT_EXPR_P (offset))
-               offset = TREE_OPERAND (offset, 0);
-
              /* An offset which is a bitwise AND with a negative power of 2
                 means an alignment corresponding to this power of 2.  */
+             offset = remove_conversions (offset, true);
              if (TREE_CODE (offset) == BIT_AND_EXPR
                  && host_integerp (TREE_OPERAND (offset, 1), 0)
                  && tree_int_cst_sgn (TREE_OPERAND (offset, 1)) < 0)