]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/21912 (Wrong implied do-loop)
authorTobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
Sun, 5 Jun 2005 19:01:57 +0000 (21:01 +0200)
committerTobias Schlüter <tobi@gcc.gnu.org>
Sun, 5 Jun 2005 19:01:57 +0000 (21:01 +0200)
fortran/
PR fortran/21912
* trans-array.c (gfc_trans_array_constructor_value): Slightly reorder.
Generate correct exit condition in case of negative steps in
implied-do loops.
testsuite/
PR fortran/21912
* gfortran.dg/array_constructor_4.f90: New test.

From-SVN: r100635

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

index 1b7cd23c8e1fd086d9bcf139ac567ef9c7a0d17b..5e5941c1d10c682721f621a9afdb403f28a07aad 100644 (file)
@@ -1,5 +1,10 @@
 2005-06-05  Tobias Schl"uter  <tobias.schlueter@physik.uni-muenchen.de>
 
+       PR fortran/21912
+       * trans-array.c (gfc_trans_array_constructor_value): Slightly reorder.
+       Generate correct exit condition in case of negative steps in
+       implied-do loops.
+
        * invoke.texi: Fix description of flags required for compatibility
        with g77.
 
index 0a83fa3d41401ec392f296bde76bb8a0488e9363..cf328221106845f31085a7445ed8e18c2e757cb5 100644 (file)
@@ -721,7 +721,6 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type,
 {
   tree tmp;
   stmtblock_t body;
-  tree loopbody;
   gfc_se se;
 
   for (; c; c = c->next)
@@ -842,13 +841,23 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type,
             }
        }
 
-      /* The frontend should already have done any expansions.  */
-      if (c->iterator)
+      /* The frontend should already have done any expansions possible
+        at compile-time.  */
+      if (!c->iterator)
+       {
+         /* Pass the code as is.  */
+         tmp = gfc_finish_block (&body);
+         gfc_add_expr_to_block (pblock, tmp);
+       }
+      else
        {
+         /* Build the implied do-loop.  */
+         tree cond;
          tree end;
          tree step;
          tree loopvar;
          tree exit_label;
+         tree loopbody;
 
          loopbody = gfc_finish_block (&body);
 
@@ -877,17 +886,25 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type,
          exit_label = gfc_build_label_decl (NULL_TREE);
          gfc_start_block (&body);
 
-         /* Generate the exit condition.  */
-         end = build2 (GT_EXPR, boolean_type_node, loopvar, end);
+         /* Generate the exit condition.  Depending on the sign of
+            the step variable we have to generate the correct
+            comparison.  */
+         tmp = fold (build2 (GT_EXPR, boolean_type_node, step, 
+                             build_int_cst (TREE_TYPE (step), 0)));
+         cond = fold (build3 (COND_EXPR, boolean_type_node, tmp,
+                              build2 (GT_EXPR, boolean_type_node,
+                                      loopvar, end),
+                              build2 (LT_EXPR, boolean_type_node,
+                                      loopvar, end)));
          tmp = build1_v (GOTO_EXPR, exit_label);
          TREE_USED (exit_label) = 1;
-         tmp = build3_v (COND_EXPR, end, tmp, build_empty_stmt ());
+         tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
          gfc_add_expr_to_block (&body, tmp);
 
          /* The main loop body.  */
          gfc_add_expr_to_block (&body, loopbody);
 
-         /* Increment the loop variable.  */
+         /* Increase loop variable by step.  */
          tmp = build2 (PLUS_EXPR, TREE_TYPE (loopvar), loopvar, step);
          gfc_add_modify_expr (&body, loopvar, tmp);
 
@@ -900,12 +917,6 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type,
          tmp = build1_v (LABEL_EXPR, exit_label);
          gfc_add_expr_to_block (pblock, tmp);
        }
-      else
-       {
-         /* Pass the code as is.  */
-         tmp = gfc_finish_block (&body);
-         gfc_add_expr_to_block (pblock, tmp);
-       }
     }
 }
 
index 4c073a79b684a52e54c4537a89a5e0dcaa581d84..208babcbad02f369b41e141d7237997382d20a22 100644 (file)
@@ -1,5 +1,8 @@
 2005-06-05  Tobias Schl"uter  <tobias.schlueter@physik.uni-muenchen.de>
 
+       PR fortran/21912
+       * gfortran.dg/array_constructor_4.f90: New test.
+       
        * gfortran.dg/forall_1.f90: Set previously uninitialized variable.
 
 2005-06-05  Mark Mitchell  <mark@codesourcery.com>