This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/31725] substring bound evaluated multiple times: wrong code for string(function():) = 'X'
- From: "fxcoudert at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 4 May 2007 21:15:39 -0000
- Subject: [Bug fortran/31725] substring bound evaluated multiple times: wrong code for string(function():) = 'X'
- References: <bug-31725-14459@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #5 from fxcoudert at gcc dot gnu dot org 2007-05-04 22:15 -------
Here's a patch that avoids multiple evaluation of substring start and end
indices. It was tested on the testcase, also by changing the (start:) range
into a (:end) range, and also by using -fbounds-check (which evaluated the
start and end indices a few other times). It's not fully regtested yet, though.
Index: trans-expr.c
===================================================================
--- trans-expr.c (revision 124285)
+++ trans-expr.c (working copy)
@@ -261,6 +261,9 @@ gfc_conv_substring (gfc_se * se, gfc_ref
gfc_conv_string_parameter (se);
else
{
+ /* Avoid multiple evaluation of substring start. */
+ start.expr = gfc_evaluate_now (start.expr, &se->pre);
+
/* Change the start of the string. */
if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
tmp = se->expr;
@@ -279,6 +282,8 @@ gfc_conv_substring (gfc_se * se, gfc_ref
gfc_conv_expr_type (&end, ref->u.ss.end, gfc_charlen_type_node);
gfc_add_block_to_block (&se->pre, &end.pre);
}
+ end.expr = gfc_evaluate_now (end.expr, &se->pre);
+
if (flag_bounds_check)
{
tree nonempty = fold_build2 (LE_EXPR, boolean_type_node,
--
fxcoudert at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
AssignedTo|unassigned at gcc dot gnu |fxcoudert at gcc dot gnu dot
|dot org |org
Status|NEW |ASSIGNED
Keywords| |patch
Last reconfirmed|2007-04-27 18:59:17 |2007-05-04 22:15:38
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31725