aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-05-14 19:29:33 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-05-14 19:29:33 +0000
commit1af5627c40801eb1715b9ac1eadff50d1de46288 (patch)
tree881664a2a668dabf5b889bcf482119a96600fb05 /gcc/fortran
parent9c40feebdbb2bf7edd0dc43709ea47de67130a59 (diff)
downloadgcc-1af5627c40801eb1715b9ac1eadff50d1de46288.zip
gcc-1af5627c40801eb1715b9ac1eadff50d1de46288.tar.gz
gcc-1af5627c40801eb1715b9ac1eadff50d1de46288.tar.bz2
re PR fortran/31725 ([4.1 only] substring bound evaluated multiple times: wrong code for string(function():) = 'X')
PR fortran/31725 * trans-expr.c (gfc_conv_substring): Evaluate substring bounds only once. * gfortran.dg/substr_4.f: New test. From-SVN: r124720
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-expr.c7
2 files changed, 13 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index f94b3c3..87947c2 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2007-05-14 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ PR fortran/31725
+ * trans-expr.c (gfc_conv_substring): Evaluate substring bounds
+ only once.
+
2007-05-14 Rafael Avila de Espindola <espindola@google.com>
* f95-lang.c (LANG_HOOKS_UNSIGNED_TYPE): Remove.
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 239e41e..34be30c 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -261,6 +261,10 @@ gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind,
gfc_conv_string_parameter (se);
else
{
+ /* Avoid multiple evaluation of substring start. */
+ if (!CONSTANT_CLASS_P (start.expr) && !DECL_P (start.expr))
+ 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 +283,9 @@ gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind,
gfc_conv_expr_type (&end, ref->u.ss.end, gfc_charlen_type_node);
gfc_add_block_to_block (&se->pre, &end.pre);
}
+ if (!CONSTANT_CLASS_P (end.expr) && !DECL_P (end.expr))
+ end.expr = gfc_evaluate_now (end.expr, &se->pre);
+
if (flag_bounds_check)
{
tree nonempty = fold_build2 (LE_EXPR, boolean_type_node,