From 2b052ce2f5a1c84ca9efded4df9308669b9e25e5 Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Tue, 31 May 2005 17:19:11 +0000 Subject: [PATCH] re PR fortran/18109 (ICE with explicit array of strings) 2005-05-30 Paul Thomas PR fortran/18109 PR fortran/18283 PR fortran/19107 * fortran/trans-array.c (gfc_conv_expr_descriptor): Obtain the string length from the expression typespec character length value and set temp_ss->stringlength and backend_decl. Obtain the tree expression from gfc_conv_expr rather than gfc_conv_expr_val. Dereference the expression to obtain the character. * fortran/trans-expr.c (gfc_conv_component_ref): Remove the dereference of scalar character pointer structure components. * fortran/trans-expr.c (gfc_trans_subarray_assign): Obtain the string length for the structure component from the component expression. From-SVN: r100400 --- gcc/fortran/ChangeLog | 16 ++++++++++++++++ gcc/fortran/trans-array.c | 25 +++++++++++++++++++++---- gcc/fortran/trans-expr.c | 5 ++++- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d2253328760..6ea04202d5a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,19 @@ +2005-05-31 Paul Thomas + + PR fortran/18109 + PR fortran/18283 + PR fortran/19107 + * fortran/trans-array.c (gfc_conv_expr_descriptor): Obtain the + string length from the expression typespec character length value + and set temp_ss->stringlength and backend_decl. Obtain the + tree expression from gfc_conv_expr rather than gfc_conv_expr_val. + Dereference the expression to obtain the character. + * fortran/trans-expr.c (gfc_conv_component_ref): Remove the + dereference of scalar character pointer structure components. + * fortran/trans-expr.c (gfc_trans_subarray_assign): Obtain the + string length for the structure component from the component + expression. + 2005-05-30 Roger Sayle * gfortran.h (GFC_STD_LEGACY): New "standard" macro. Reindent. diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 047f8bcd7f1..fabbef99dc9 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -3616,12 +3616,23 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) loop.temp_ss = gfc_get_ss (); loop.temp_ss->type = GFC_SS_TEMP; loop.temp_ss->next = gfc_ss_terminator; - loop.temp_ss->data.temp.type = gfc_typenode_for_spec (&expr->ts); + if (expr->ts.type == BT_CHARACTER) + { + gcc_assert (expr->ts.cl && expr->ts.cl->length + && expr->ts.cl->length->expr_type == EXPR_CONSTANT); + loop.temp_ss->string_length = gfc_conv_mpz_to_tree + (expr->ts.cl->length->value.integer, + expr->ts.cl->length->ts.kind); + expr->ts.cl->backend_decl = loop.temp_ss->string_length; + } + loop.temp_ss->data.temp.type = gfc_typenode_for_spec (&expr->ts); /* ... which can hold our string, if present. */ if (expr->ts.type == BT_CHARACTER) - se->string_length = loop.temp_ss->string_length - = TYPE_SIZE_UNIT (loop.temp_ss->data.temp.type); + { + loop.temp_ss->string_length = TYPE_SIZE_UNIT (loop.temp_ss->data.temp.type); + se->string_length = loop.temp_ss->string_length; + } else loop.temp_ss->string_length = NULL; loop.temp_ss->data.temp.dimen = loop.dimen; @@ -3653,7 +3664,13 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) rse.ss = ss; gfc_conv_scalarized_array_ref (&lse, NULL); - gfc_conv_expr_val (&rse, expr); + if (expr->ts.type == BT_CHARACTER) + { + gfc_conv_expr (&rse, expr); + rse.expr = gfc_build_indirect_ref (rse.expr); + } + else + gfc_conv_expr_val (&rse, expr); gfc_add_block_to_block (&block, &rse.pre); gfc_add_block_to_block (&block, &lse.pre); diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index cb6f167ff94..3d7dc726f38 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -281,7 +281,7 @@ gfc_conv_component_ref (gfc_se * se, gfc_ref * ref) se->string_length = tmp; } - if (c->pointer && c->dimension == 0) + if (c->pointer && c->dimension == 0 && c->ts.type != BT_CHARACTER) se->expr = gfc_build_indirect_ref (se->expr); } @@ -1671,6 +1671,9 @@ gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr) gfc_start_scalarized_body (&loop, &body); gfc_conv_tmp_array_ref (&lse); + if (cm->ts.type == BT_CHARACTER) + lse.string_length = cm->ts.cl->backend_decl; + gfc_conv_expr (&rse, expr); tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts.type);