diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2006-06-24 13:04:37 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2006-06-24 13:04:37 +0000 |
commit | 32fdfa2dfadae6448ed8a7229952120aa3b005bb (patch) | |
tree | 51380b5f1c5f43b3507b40c0d72285be2606774c /gcc/fortran/trans-array.c | |
parent | 61c25908fdbf3b6c29334ff84b30fcfaa2e29880 (diff) | |
download | gcc-32fdfa2dfadae6448ed8a7229952120aa3b005bb.zip gcc-32fdfa2dfadae6448ed8a7229952120aa3b005bb.tar.gz gcc-32fdfa2dfadae6448ed8a7229952120aa3b005bb.tar.bz2 |
re PR fortran/28118 (ICE calling subroutine defined via explicit interface)
2006-06-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/28118
* trans-array.c (gfc_conv_expr_descriptor): When building temp,
use the substring reference to calculate the length if the
expression does not have a charlen.
2006-06-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/28118
* gfortran.dg/actual_array_substr_1.f90: New test.
From-SVN: r114964
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 941e711..6a2c2de 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -4184,9 +4184,37 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) loop.temp_ss->next = gfc_ss_terminator; if (expr->ts.type == BT_CHARACTER) { - if (expr->ts.cl - && expr->ts.cl->length - && expr->ts.cl->length->expr_type == EXPR_CONSTANT) + if (expr->ts.cl == NULL) + { + /* This had better be a substring reference! */ + gfc_ref *char_ref = expr->ref; + for (; char_ref; char_ref = char_ref->next) + if (char_ref->type == REF_SUBSTRING) + { + mpz_t char_len; + expr->ts.cl = char_ref->u.ss.length; + mpz_init_set_ui (char_len, 1); + mpz_add (char_len, char_len, + char_ref->u.ss.end->value.integer); + mpz_sub (char_len, char_len, + char_ref->u.ss.start->value.integer); + expr->ts.cl->backend_decl + = gfc_conv_mpz_to_tree (char_len, + gfc_default_character_kind); + /* Cast is necessary for *-charlen refs. */ + expr->ts.cl->backend_decl + = convert (gfc_charlen_type_node, + expr->ts.cl->backend_decl); + mpz_clear (char_len); + break; + } + gcc_assert (char_ref != NULL); + loop.temp_ss->data.temp.type + = gfc_typenode_for_spec (&expr->ts); + loop.temp_ss->string_length = expr->ts.cl->backend_decl; + } + else if (expr->ts.cl->length + && expr->ts.cl->length->expr_type == EXPR_CONSTANT) { expr->ts.cl->backend_decl = gfc_conv_mpz_to_tree (expr->ts.cl->length->value.integer, |