OSDN Git Service

2011-04-30 Paul Thomas <pault@gcc.gnu.org>
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 30 Apr 2011 11:46:31 +0000 (11:46 +0000)
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 30 Apr 2011 11:46:31 +0000 (11:46 +0000)
PR fortran/48746
* trans-expr.c (fcncall_realloc_result): Set the bounds and the
offset so that the lbounds are one.
(gfc_trans_arrayfunc_assign): Add rank to arguments of above.

2011-04-30  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/48746
* gfortran.dg/realloc_on_assign_7.f03: Test bounds.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@173213 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/realloc_on_assign_7.f03

index 0f7db3a..e5b8d31 100644 (file)
@@ -1,3 +1,10 @@
+2011-04-30  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/48746
+       * trans-expr.c (fcncall_realloc_result): Set the bounds and the
+       offset so that the lbounds are one.
+       (gfc_trans_arrayfunc_assign): Add rank to arguments of above.
+
 2011-04-29  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/48462
index 1582833..3dde298 100644 (file)
@@ -5539,11 +5539,13 @@ realloc_lhs_loop_for_fcn_call (gfc_se *se, locus *where, gfc_ss **ss,
    result to the original descriptor.  */
 
 static void
-fcncall_realloc_result (gfc_se *se)
+fcncall_realloc_result (gfc_se *se, int rank)
 {
   tree desc;
   tree res_desc;
   tree tmp;
+  tree offset;
+  int n;
 
   /* Use the allocation done by the library.  Substitute the lhs
      descriptor with a copy, whose data field is nulled.*/
@@ -5555,13 +5557,44 @@ fcncall_realloc_result (gfc_se *se)
   gfc_conv_descriptor_data_set (&se->pre, res_desc, null_pointer_node);
   se->expr = gfc_build_addr_expr (TREE_TYPE (se->expr), res_desc);
 
-  /* Free the lhs after the function call and copy the result data to
-     it.  */
+  /* Free the lhs after the function call and copy the result to
+     the lhs descriptor.  */
   tmp = gfc_conv_descriptor_data_get (desc);
   tmp = gfc_call_free (fold_convert (pvoid_type_node, tmp));
   gfc_add_expr_to_block (&se->post, tmp);
-  tmp = gfc_conv_descriptor_data_get (res_desc);
-  gfc_conv_descriptor_data_set (&se->post, desc, tmp);
+  gfc_add_modify (&se->post, desc, res_desc);
+
+  offset = gfc_index_zero_node;
+  tmp = gfc_index_one_node;
+  /* Now reset the bounds from zero based to unity based.  */
+  for (n = 0 ; n < rank; n++)
+    {
+      /* Accumulate the offset.  */
+      offset = fold_build2_loc (input_location, MINUS_EXPR,
+                               gfc_array_index_type,
+                               offset, tmp);
+      /* Now do the bounds.  */
+      gfc_conv_descriptor_offset_set (&se->post, desc, tmp);
+      tmp = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[n]);
+      tmp = fold_build2_loc (input_location, PLUS_EXPR,
+                            gfc_array_index_type,
+                            tmp, gfc_index_one_node);
+      gfc_conv_descriptor_lbound_set (&se->post, desc,
+                                     gfc_rank_cst[n],
+                                     gfc_index_one_node);
+      gfc_conv_descriptor_ubound_set (&se->post, desc,
+                                     gfc_rank_cst[n], tmp);
+
+      /* The extent for the next contribution to offset.  */
+      tmp = fold_build2_loc (input_location, MINUS_EXPR,
+                            gfc_array_index_type,
+                            gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[n]),
+                            gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[n]));
+      tmp = fold_build2_loc (input_location, PLUS_EXPR,
+                            gfc_array_index_type,
+                            tmp, gfc_index_one_node);
+    }
+  gfc_conv_descriptor_offset_set (&se->post, desc, offset);
 }
 
 
@@ -5631,7 +5664,7 @@ gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
          ss->is_alloc_lhs = 1;
        }
       else
-       fcncall_realloc_result (&se);
+       fcncall_realloc_result (&se, expr1->rank);
     }
 
   gfc_conv_function_expr (&se, expr2);
index 5eaa00d..a4599ca 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-30  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/48746
+       * gfortran.dg/realloc_on_assign_7.f03: Test bounds.
+
 2011-04-30  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/48809
index ca9a2d9..f871d27 100644 (file)
@@ -77,5 +77,8 @@ contains
     call random_number(a)
     call random_number(b)
     tmp = matmul(a,b)
+    if (any (lbound (tmp) .ne. [1,1])) call abort
+    if (any (ubound (tmp) .ne. [10,12])) call abort
   end subroutine
 end program main
+