aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/simplify.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/fortran/simplify.c')
-rw-r--r--gcc/fortran/simplify.c24
1 files changed, 17 insertions, 7 deletions
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;
}