From 1af5627c40801eb1715b9ac1eadff50d1de46288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois-Xavier=20Coudert?= Date: Mon, 14 May 2007 19:29:33 +0000 Subject: 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 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/trans-expr.c | 7 +++++++ 2 files changed, 13 insertions(+) (limited to 'gcc/fortran') 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 + + PR fortran/31725 + * trans-expr.c (gfc_conv_substring): Evaluate substring bounds + only once. + 2007-05-14 Rafael Avila de Espindola * 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, -- cgit v1.1