diff options
| author | H.J. Lu <hjl@gcc.gnu.org> | 2006-04-04 21:47:51 -0700 |
|---|---|---|
| committer | H.J. Lu <hjl@gcc.gnu.org> | 2006-04-04 21:47:51 -0700 |
| commit | 20b1cbc33f4d16ccb359b70650d72988a2d4fbb1 (patch) | |
| tree | 6c69f4803b48dee15416ebf0372df25c81515254 /gcc/fortran/trans-array.c | |
| parent | 4dea2268c3e078f87b7d6dae58c01ef816cb4ef9 (diff) | |
| download | gcc-20b1cbc33f4d16ccb359b70650d72988a2d4fbb1.zip gcc-20b1cbc33f4d16ccb359b70650d72988a2d4fbb1.tar.gz gcc-20b1cbc33f4d16ccb359b70650d72988a2d4fbb1.tar.bz2 | |
re PR fortran/25619 (temporary array of constant size character type goes wrong)
gcc/fortran/
2006-04-04 H.J. Lu <hongjiu.lu@intel.com>
PR fortran/25619
* trans-array.c (gfc_conv_expr_descriptor): Only dereference
character pointer when copying temporary.
PR fortran/23634
* trans-array.c (gfc_conv_expr_descriptor): Properly copy
temporary character with non constant size.
gcc/testsuite/
2006-04-04 Paul Thomas <pault@gcc.gnu.org>
PR fortran/23634
PR fortran/25619
* gfortran.dg/actual_array_constructor_1.f90: New testcase.
From-SVN: r112695
Diffstat (limited to 'gcc/fortran/trans-array.c')
| -rw-r--r-- | gcc/fortran/trans-array.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 5ebec62..4bdc784 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -3973,23 +3973,32 @@ 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) { - 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) - { - loop.temp_ss->string_length = TYPE_SIZE_UNIT (loop.temp_ss->data.temp.type); + if (expr->ts.cl + && 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, + expr->ts.cl->length->ts.kind); + loop.temp_ss->data.temp.type + = gfc_typenode_for_spec (&expr->ts); + loop.temp_ss->string_length + = TYPE_SIZE_UNIT (loop.temp_ss->data.temp.type); + } + else + { + loop.temp_ss->data.temp.type + = gfc_typenode_for_spec (&expr->ts); + loop.temp_ss->string_length = expr->ts.cl->backend_decl; + } se->string_length = loop.temp_ss->string_length; } else - loop.temp_ss->string_length = NULL; + { + loop.temp_ss->data.temp.type + = gfc_typenode_for_spec (&expr->ts); + loop.temp_ss->string_length = NULL; + } loop.temp_ss->data.temp.dimen = loop.dimen; gfc_add_ss_to_loop (&loop, loop.temp_ss); } @@ -4022,7 +4031,8 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) if (expr->ts.type == BT_CHARACTER) { gfc_conv_expr (&rse, expr); - rse.expr = build_fold_indirect_ref (rse.expr); + if (POINTER_TYPE_P (TREE_TYPE (rse.expr))) + rse.expr = build_fold_indirect_ref (rse.expr); } else gfc_conv_expr_val (&rse, expr); |
