re PR fortran/66927 (ICE in gfc_conf_procedure_call)
authorAndre Vehreschild <vehre@gcc.gnu.org>
Mon, 26 Oct 2015 13:03:22 +0000 (14:03 +0100)
committerAndre Vehreschild <vehre@gcc.gnu.org>
Mon, 26 Oct 2015 13:03:22 +0000 (14:03 +0100)
gcc/fortran/ChangeLog:

2015-10-26  Andre Vehreschild  <vehre@gcc.gnu.org>

PR fortran/66927
* trans-array.c (evaluate_bound): For deferred length arrays get the
bounds directly from the descriptor, i.e., prevent using constant
zero lower bound from the gfc_conv_array_lbound () routine.
(gfc_conv_section_startstride): Hand deferred array status to
evaluate_bound ().
(gfc_conv_expr_descriptor): Same.

From-SVN: r229353

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

index 668013d7dcd4841d4f16da635c0080828a8b7474..f7556305678eee1b8ee8643be0a3630227200911 100644 (file)
@@ -1,3 +1,13 @@
+2015-10-26  Andre Vehreschild  <vehre@gcc.gnu.org>
+
+       PR fortran/66927
+       * trans-array.c (evaluate_bound): For deferred length arrays get the
+       bounds directly from the descriptor, i.e., prevent using constant
+       zero lower bound from the gfc_conv_array_lbound () routine.
+       (gfc_conv_section_startstride): Hand deferred array status to
+       evaluate_bound ().
+       (gfc_conv_expr_descriptor): Same.
+
 2015-01-25  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/67171
index b726998cfcd221dae27300f229a17644474a8a68..f6e980d72aba4184aef0e083c4cdb94c2446886c 100644 (file)
@@ -3809,7 +3809,7 @@ gfc_trans_scalarized_loop_boundary (gfc_loopinfo * loop, stmtblock_t * body)
 
 static void
 evaluate_bound (stmtblock_t *block, tree *bounds, gfc_expr ** values,
-               tree desc, int dim, bool lbound)
+               tree desc, int dim, bool lbound, bool deferred)
 {
   gfc_se se;
   gfc_expr * input_val = values[dim];
@@ -3824,6 +3824,17 @@ evaluate_bound (stmtblock_t *block, tree *bounds, gfc_expr ** values,
       gfc_add_block_to_block (block, &se.pre);
       *output = se.expr;
     }
+  else if (deferred)
+    {
+      /* The gfc_conv_array_lbound () routine returns a constant zero for
+        deferred length arrays, which in the scalarizer wrecks havoc, when
+        copying to a (newly allocated) one-based array.
+        Keep returning the actual result in sync for both bounds.  */
+      *output = lbound ? gfc_conv_descriptor_lbound_get (desc,
+                                                        gfc_rank_cst[dim]):
+                        gfc_conv_descriptor_ubound_get (desc,
+                                                        gfc_rank_cst[dim]);
+    }
   else
     {
       /* No specific bound specified so use the bound of the array.  */
@@ -3864,14 +3875,18 @@ gfc_conv_section_startstride (stmtblock_t * block, gfc_ss * ss, int dim)
   desc = info->descriptor;
   stride = ar->stride[dim];
 
+
   /* Calculate the start of the range.  For vector subscripts this will
      be the range of the vector.  */
-  evaluate_bound (block, info->start, ar->start, desc, dim, true);
+  evaluate_bound (block, info->start, ar->start, desc, dim, true,
+                 ar->as->type == AS_DEFERRED);
 
   /* Similarly calculate the end.  Although this is not used in the
      scalarizer, it is needed when checking bounds and where the end
      is an expression with side-effects.  */
-  evaluate_bound (block, info->end, ar->end, desc, dim, false);
+  evaluate_bound (block, info->end, ar->end, desc, dim, false,
+                 ar->as->type == AS_DEFERRED);
+
 
   /* Calculate the stride.  */
   if (stride == NULL)
@@ -6965,7 +6980,8 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr)
 
          gcc_assert (n == codim - 1);
          evaluate_bound (&loop.pre, info->start, ar->start,
-                         info->descriptor, n + ndim, true);
+                         info->descriptor, n + ndim, true,
+                         ar->as->type == AS_DEFERRED);
          loop.from[n + loop.dimen] = info->start[n + ndim];
        }
       else