diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2007-10-20 09:27:09 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2007-10-20 09:27:09 +0000 |
commit | 6f535271b7ddae27e177a1ba1cb091872aeea04e (patch) | |
tree | 3fa345cde095245a568f75f1889395bfe390ddd2 /gcc/fortran/trans-array.c | |
parent | 0362597e222df3924c7317831515daaa37a2a459 (diff) | |
download | gcc-6f535271b7ddae27e177a1ba1cb091872aeea04e.zip gcc-6f535271b7ddae27e177a1ba1cb091872aeea04e.tar.gz gcc-6f535271b7ddae27e177a1ba1cb091872aeea04e.tar.bz2 |
re PR fortran/31608 (wrong types in character array/scalar binop)
2007-10-20 Paul Thomas <pault@gcc.gnu.org>
FX Coudert <fxcoudert@gcc.gnu.org>
PR fortran/31608
* trans-array.c (gfc_conv_expr_descriptor): For all except
indirect references, use gfc_trans_scalar_assign instead of
gfc_add_modify_expr.
* iresolve.c (check_charlen_present): Separate creation of cl
if necessary and add code to treat an EXPR_ARRAY.
(gfc_resolve_char_achar): New function.
(gfc_resolve_achar, gfc_resolve_char): Call it.
(gfc_resolve_transfer): If the MOLD expression does not have a
character length expression, get it from a constant length.
2007-10-20 Paul Thomas <pault@gcc.gnu.org>
FX Coudert <fxcoudert@gcc.gnu.org>
PR fortran/31608
* gfortran.dg/char_cast_1.f90: New test.
Co-Authored-By: Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
From-SVN: r129505
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index c598d25..680d3b4 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -4727,7 +4727,15 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) gfc_add_block_to_block (&block, &rse.pre); gfc_add_block_to_block (&block, &lse.pre); - gfc_add_modify_expr (&block, lse.expr, rse.expr); + if (TREE_CODE (rse.expr) != INDIRECT_REF) + { + lse.string_length = rse.string_length; + tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, true, + expr->expr_type == EXPR_VARIABLE); + gfc_add_expr_to_block (&block, tmp); + } + else + gfc_add_modify_expr (&block, lse.expr, rse.expr); /* Finish the copying loops. */ gfc_trans_scalarizing_loops (&loop, &block); |