diff options
author | Francois-Xavier Coudert <coudert@clipper.ens.fr> | 2007-03-19 09:13:30 +0100 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-03-19 08:13:30 +0000 |
commit | 886c8de1939d8028f3568d7f586468d6f796153c (patch) | |
tree | 203824e06002e0907a7765058ac5465595c78f58 /gcc/fortran | |
parent | fd975604c284f72025d34d35e97fa157b1bd451b (diff) | |
download | gcc-886c8de1939d8028f3568d7f586468d6f796153c.zip gcc-886c8de1939d8028f3568d7f586468d6f796153c.tar.gz gcc-886c8de1939d8028f3568d7f586468d6f796153c.tar.bz2 |
re PR fortran/31203 ([4.1/4.2 only] Character length should never be negative)
PR fortran/31203
* trans-expr.c (gfc_trans_init_string_length): Length should
never be negative.
(gfc_conv_function_call): Likewise.
* gfortran.dg/string_length_1.f90: New test.
From-SVN: r123051
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/trans-expr.c | 10 |
2 files changed, 16 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9ba6544..3f4ab3c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2007-03-19 Francois-Xavier Coudert <coudert@clipper.ens.fr> + + PR fortran/31203 + * trans-expr.c (gfc_trans_init_string_length): Length should + never be negative. + (gfc_conv_function_call): Likewise. + 2007-03-18 Paul Thomas <pault@gcc.gnu.org> PR fortran/30531 diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index c6448ec..a6920db 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -227,6 +227,8 @@ gfc_trans_init_string_length (gfc_charlen * cl, stmtblock_t * pblock) gfc_init_se (&se, NULL); gfc_conv_expr_type (&se, cl->length, gfc_charlen_type_node); + se.expr = fold_build2 (MAX_EXPR, gfc_charlen_type_node, se.expr, + build_int_cst (gfc_charlen_type_node, 0)); gfc_add_block_to_block (pblock, &se.pre); tmp = cl->backend_decl; @@ -2256,6 +2258,8 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym, } else { + tree tmp; + /* Calculate the length of the returned string. */ gfc_init_se (&parmse, NULL); if (need_interface_mapping) @@ -2264,7 +2268,11 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym, gfc_conv_expr (&parmse, sym->ts.cl->length); gfc_add_block_to_block (&se->pre, &parmse.pre); gfc_add_block_to_block (&se->post, &parmse.post); - cl.backend_decl = fold_convert (gfc_charlen_type_node, parmse.expr); + + tmp = fold_convert (gfc_charlen_type_node, parmse.expr); + tmp = fold_build2 (MAX_EXPR, gfc_charlen_type_node, tmp, + build_int_cst (gfc_charlen_type_node, 0)); + cl.backend_decl = tmp; } /* Set up a charlen structure for it. */ |