aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <coudert@clipper.ens.fr>2006-04-29 18:31:26 +0200
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2006-04-29 16:31:26 +0000
commit49914d0380452c7dd89fb976d02b0e170694d553 (patch)
treea1cdf2e149765fe457e2564ec009f6c60b4be252 /gcc
parentc69a7fb7a6c969ff242f8ba82c52cd330e290363 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/simplify.c24
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/char_type_len.f9012
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