From 49914d0380452c7dd89fb976d02b0e170694d553 Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Sat, 29 Apr 2006 18:31:26 +0200 Subject: [PATCH] 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/ChangeLog | 6 ++++++ gcc/fortran/simplify.c | 24 +++++++++++++++------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/char_type_len.f90 | 12 +++++++++++ 4 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/char_type_len.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index dcb73931010..f275c5f8dd3 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2006-04-29 Francois-Xavier Coudert + + PR fortran/25681 + * simplify.c (simplify_len): Character variables with constant + length can be simplified. + 2006-04-29 H.J. Lu PR fortran/27351 diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index d5dfb344fcb..403f9c7f06c 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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 99070374fdf..7bd203ef2b5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-04-29 Francois-Xavier Coudert + + PR fortran/25681 + * gfortran.df/char_type_len.f90: New test. + 2006-04-28 Jerry DeLisle PR libgfortran/27304 diff --git a/gcc/testsuite/gfortran.dg/char_type_len.f90 b/gcc/testsuite/gfortran.dg/char_type_len.f90 new file mode 100644 index 00000000000..706f9341fe0 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/char_type_len.f90 @@ -0,0 +1,12 @@ +! { dg-do run } +! Testcase for PR fortran/25681 +program char_type_len + integer,parameter :: n = 9 + type foo_t + character (len = 80) :: bar (1) + character (len = 75) :: gee (n) + end type foo_t + type(foo_t) :: foo + + if (len(foo%bar) /= 80 .or. len(foo%gee) /= 75) call abort +end program char_type_len -- 2.30.2