trans-expr.c (gfc_trans_pointer_assignment): Convert array descriptor for subref...
authorPaul Thomas <pault@gcc.gnu.org>
Fri, 21 Sep 2007 15:02:44 +0000 (15:02 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Fri, 21 Sep 2007 15:02:44 +0000 (15:02 +0000)
2007-09-21  Paul Thomas  <pault@gcc.gnu.org>

*trans-expr.c (gfc_trans_pointer_assignment): Convert array
descriptor for subref pointer assignements, rather than using
the loop info version.

From-SVN: r128651

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c

index def238f35314112584cb64c196c5d996e672ecfd..586c71919eb7316bd026683be704e920aee22ef1 100644 (file)
@@ -1,3 +1,9 @@
+2007-09-21  Paul Thomas  <pault@gcc.gnu.org>
+
+       *trans-expr.c (gfc_trans_pointer_assignment): Convert array
+       descriptor for subref pointer assignements, rather than using
+       the loop info version.
+
 2007-09-21  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/33037
index f5d7c65b80f4cfb50234688a7d4ce7be8bbc3818..dff1fd8fcc148727e43f0336b9360e270d13cac2 100644 (file)
@@ -3499,14 +3499,17 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
          gfc_conv_expr_descriptor (&lse, expr2, rss);
 
          /* If this is a subreference array pointer assignment, use the rhs
-            element size for the lhs span.  */
+            descriptor element size for the lhs span.  */
          if (expr1->symtree->n.sym->attr.subref_array_pointer)
            {
              decl = expr1->symtree->n.sym->backend_decl;
-             tmp = rss->data.info.descriptor;
-             tmp = gfc_get_element_type (TREE_TYPE (tmp));
-             tmp = size_in_bytes (tmp);
-             tmp = fold_convert (gfc_array_index_type, tmp);
+             gfc_init_se (&rse, NULL);
+             rse.descriptor_only = 1;
+             gfc_conv_expr (&rse, expr2);
+             tmp = gfc_get_element_type (TREE_TYPE (rse.expr));
+             tmp = fold_convert (gfc_array_index_type, size_in_bytes (tmp));
+             if (!INTEGER_CST_P (tmp))
+               gfc_add_block_to_block (&lse.post, &rse.pre);
              gfc_add_modify_expr (&lse.post, GFC_DECL_SPAN(decl), tmp);
            }