From 49914d0380452c7dd89fb976d02b0e170694d553 Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Sat, 29 Apr 2006 18:31:26 +0200 Subject: re PR fortran/25681 (ICE with len of array of derived type) PR fortran/25681 * simplify.c (simplify_len): Character variables with constant length can be simplified. * gfortran.df/char_type_len.f90: New test. From-SVN: r113376 --- gcc/fortran/simplify.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'gcc/fortran/simplify.c') diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index d5dfb34..403f9c7 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -1930,14 +1930,24 @@ gfc_simplify_len (gfc_expr * e) { gfc_expr *result; - if (e->expr_type != EXPR_CONSTANT) - return NULL; - - result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind, - &e->where); + if (e->expr_type == EXPR_CONSTANT) + { + result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind, + &e->where); + mpz_set_si (result->value.integer, e->value.character.length); + return range_check (result, "LEN"); + } - mpz_set_si (result->value.integer, e->value.character.length); - return range_check (result, "LEN"); + if (e->ts.cl != NULL && e->ts.cl->length != NULL + && e->ts.cl->length->expr_type == EXPR_CONSTANT) + { + result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind, + &e->where); + mpz_set (result->value.integer, e->ts.cl->length->value.integer); + return range_check (result, "LEN"); + } + + return NULL; } -- cgit v1.1