diff options
| author | Francois-Xavier Coudert <coudert@clipper.ens.fr> | 2006-06-08 23:48:05 +0200 |
|---|---|---|
| committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2006-06-08 21:48:05 +0000 |
| commit | 549033f3a2a4c31ca6443dc3208e6dedae8aa943 (patch) | |
| tree | b0ea7c8e8dc9a94d1d9c5409105320893e6ed0d0 /gcc/fortran/trans-expr.c | |
| parent | f6cf0340b9a28d1cdf632d1f4d1becc470d34ba9 (diff) | |
| download | gcc-549033f3a2a4c31ca6443dc3208e6dedae8aa943.zip gcc-549033f3a2a4c31ca6443dc3208e6dedae8aa943.tar.gz gcc-549033f3a2a4c31ca6443dc3208e6dedae8aa943.tar.bz2 | |
re PR fortran/27958 (assignments to and from zero-sized string selections not handled)
PR fortran/27958
* trans-expr.c (gfc_conv_substring): If the substring start is
greater than its end, the length of the substring is zero, and
not negative.
(gfc_trans_string_copy): Don't generate a call to
_gfortran_copy_string when destination length is zero.
* gcc/testsuite/gfortran.dg/substr_2.f: New test.
From-SVN: r114496
Diffstat (limited to 'gcc/fortran/trans-expr.c')
| -rw-r--r-- | gcc/fortran/trans-expr.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index c0422b1..9e5524f 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -275,6 +275,8 @@ gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind) build_int_cst (gfc_charlen_type_node, 1), start.expr); tmp = fold_build2 (PLUS_EXPR, gfc_charlen_type_node, end.expr, tmp); + tmp = fold_build2 (MAX_EXPR, gfc_charlen_type_node, tmp, + build_int_cst (gfc_charlen_type_node, 0)); se->string_length = tmp; } @@ -2196,6 +2198,7 @@ gfc_trans_string_copy (stmtblock_t * block, tree dlen, tree dest, tree tmp; tree dsc; tree ssc; + tree cond; /* Deal with single character specially. */ dsc = gfc_to_single_character (dlen, dest); @@ -2206,12 +2209,16 @@ gfc_trans_string_copy (stmtblock_t * block, tree dlen, tree dest, return; } + cond = fold_build2 (GT_EXPR, boolean_type_node, dlen, + build_int_cst (gfc_charlen_type_node, 0)); + tmp = NULL_TREE; tmp = gfc_chainon_list (tmp, dlen); tmp = gfc_chainon_list (tmp, dest); tmp = gfc_chainon_list (tmp, slen); tmp = gfc_chainon_list (tmp, src); tmp = build_function_call_expr (gfor_fndecl_copy_string, tmp); + tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp, build_empty_stmt ()); gfc_add_expr_to_block (block, tmp); } |
