diff options
author | Francois-Xavier Coudert <coudert@clipper.ens.fr> | 2006-04-29 18:31:26 +0200 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2006-04-29 16:31:26 +0000 |
commit | 49914d0380452c7dd89fb976d02b0e170694d553 (patch) | |
tree | a1cdf2e149765fe457e2564ec009f6c60b4be252 | |
parent | c69a7fb7a6c969ff242f8ba82c52cd330e290363 (diff) | |
download | gcc-49914d0380452c7dd89fb976d02b0e170694d553.zip gcc-49914d0380452c7dd89fb976d02b0e170694d553.tar.gz gcc-49914d0380452c7dd89fb976d02b0e170694d553.tar.bz2 |
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
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/simplify.c | 24 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/char_type_len.f90 | 12 |
4 files changed, 40 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index dcb7393..f275c5f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2006-04-29 Francois-Xavier Coudert <coudert@clipper.ens.fr> + + PR fortran/25681 + * simplify.c (simplify_len): Character variables with constant + length can be simplified. + 2006-04-29 H.J. Lu <hongjiu.lu@intel.com> PR fortran/27351 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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9907037..7bd203e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-04-29 Francois-Xavier Coudert <coudert@clipper.ens.fr> + + PR fortran/25681 + * gfortran.df/char_type_len.f90: New test. + 2006-04-28 Jerry DeLisle <jvdelisle@gcc.gnu.org> 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 0000000..706f934 --- /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 |