[Bug fortran/21912] Wrong implied do-loop
tobi at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Sun Jun 5 12:19:00 GMT 2005
------- Additional Comments From tobi at gcc dot gnu dot org 2005-06-05 12:19 -------
This patch seems to work:
2005-06-05 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/21912
* trans-array.c (gfc_trans_array_constructor_value): Allow for
negative steps in array constructor.
Index: trans-array.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/fortran/trans-array.c,v
retrieving revision 1.47
diff -u -p -r1.47 trans-array.c
--- trans-array.c 31 May 2005 17:19:10 -0000 1.47
+++ trans-array.c 5 Jun 2005 12:17:42 -0000
@@ -845,6 +845,7 @@ gfc_trans_array_constructor_value (stmtb
/* The frontend should already have done any expansions. */
if (c->iterator)
{
+ tree cond;
tree end;
tree step;
tree loopvar;
@@ -878,10 +879,16 @@ gfc_trans_array_constructor_value (stmtb
gfc_start_block (&body);
/* Generate the exit condition. */
- end = build2 (GT_EXPR, boolean_type_node, loopvar, end);
+ 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. */
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21912
More information about the Gcc-bugs
mailing list