From 357ad64f1cc374a7d63f0ac509d398a628cb56cc Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Fri, 13 Jun 2008 15:04:26 +0200 Subject: re PR fortran/36476 (ICE: len=* CHARACTER array with separate PARAMETER statement) 2008-06-13 Tobias Burnus PR fortran/36476 * decl.c (do_parm): Handle init expression for len=*. 2008-06-13 Tobias Burnus PR fortran/36476 * gfortran.dg/parameter_array_init_4.f90: New. From-SVN: r136754 --- gcc/fortran/decl.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'gcc/fortran/decl.c') diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index c4ef7e7..a1c7d5a 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -5820,10 +5820,27 @@ do_parm (void) && sym->ts.cl->length != NULL && sym->ts.cl->length->expr_type == EXPR_CONSTANT && init->expr_type == EXPR_CONSTANT - && init->ts.type == BT_CHARACTER - && init->ts.kind == 1) + && init->ts.type == BT_CHARACTER) gfc_set_constant_character_len ( mpz_get_si (sym->ts.cl->length->value.integer), init, false); + else if (sym->ts.type == BT_CHARACTER && sym->ts.cl != NULL + && sym->ts.cl->length == NULL) + { + int clen; + if (init->expr_type == EXPR_CONSTANT) + { + clen = init->value.character.length; + sym->ts.cl->length = gfc_int_expr (clen); + } + else if (init->expr_type == EXPR_ARRAY) + { + gfc_expr *p = init->value.constructor->expr; + clen = p->value.character.length; + sym->ts.cl->length = gfc_int_expr (clen); + } + else if (init->ts.cl && init->ts.cl->length) + sym->ts.cl->length = gfc_copy_expr (sym->value->ts.cl->length); + } sym->value = init; return MATCH_YES; -- cgit v1.1