diff options
author | Tobias Burnus <burnus@net-b.de> | 2008-06-13 15:04:26 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2008-06-13 15:04:26 +0200 |
commit | 357ad64f1cc374a7d63f0ac509d398a628cb56cc (patch) | |
tree | ee90829065df76d1d0e50512bc83f0ce56c5addd /gcc/fortran | |
parent | 4dc3e453c81f50fd3fac74ae85a7b7752cf58924 (diff) | |
download | gcc-357ad64f1cc374a7d63f0ac509d398a628cb56cc.zip gcc-357ad64f1cc374a7d63f0ac509d398a628cb56cc.tar.gz gcc-357ad64f1cc374a7d63f0ac509d398a628cb56cc.tar.bz2 |
re PR fortran/36476 (ICE: len=* CHARACTER array with separate PARAMETER statement)
2008-06-13 Tobias Burnus <burnus@net-b.de>
PR fortran/36476
* decl.c (do_parm): Handle init expression for len=*.
2008-06-13 Tobias Burnus <burnus@net-b.de>
PR fortran/36476
* gfortran.dg/parameter_array_init_4.f90: New.
From-SVN: r136754
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 21 |
2 files changed, 24 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e42da2f..4a6b07a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2008-06-13 Tobias Burnus <burnus@net-b.de> + + PR fortran/36476 + * decl.c (do_parm): Handle init expression for len=*. + 2008-06-12 Tobias Burnus <burnus@net-b.de> PR fortran/36462 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; |