aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-array.c
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2006-06-24 13:04:37 +0000
committerPaul Thomas <pault@gcc.gnu.org>2006-06-24 13:04:37 +0000
commit32fdfa2dfadae6448ed8a7229952120aa3b005bb (patch)
tree51380b5f1c5f43b3507b40c0d72285be2606774c /gcc/fortran/trans-array.c
parent61c25908fdbf3b6c29334ff84b30fcfaa2e29880 (diff)
downloadgcc-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.c34
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,