diff options
author | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-05-14 19:29:33 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-05-14 19:29:33 +0000 |
commit | 1af5627c40801eb1715b9ac1eadff50d1de46288 (patch) | |
tree | 881664a2a668dabf5b889bcf482119a96600fb05 /gcc/fortran | |
parent | 9c40feebdbb2bf7edd0dc43709ea47de67130a59 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-expr.c | 7 |
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, |