diff options
author | Janus Weil <janus@gcc.gnu.org> | 2010-06-11 03:42:38 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2010-06-11 03:42:38 +0200 |
commit | 66051b6074a5641299738aa1d698fc63175ca0de (patch) | |
tree | 3ccb6e0dea334cf04217c071950acf1dd21e2670 /gcc/fortran | |
parent | 328f6bf1de6d083acd24f0436c699d761bf58dc7 (diff) | |
download | gcc-66051b6074a5641299738aa1d698fc63175ca0de.zip gcc-66051b6074a5641299738aa1d698fc63175ca0de.tar.gz gcc-66051b6074a5641299738aa1d698fc63175ca0de.tar.bz2 |
re PR fortran/44207 (ICE with ALLOCATABLE components and SOURCE)
2010-06-10 Janus Weil <janus@gcc.gnu.org>
PR fortran/44207
* resolve.c (conformable_arrays): Handle allocatable components.
2010-06-10 Janus Weil <janus@gcc.gnu.org>
PR fortran/44207
* gfortran.dg/allocate_alloc_opt_7.f90: New test.
From-SVN: r160589
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 13 |
2 files changed, 13 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 5988845..6cf60ee 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2010-06-10 Janus Weil <janus@gcc.gnu.org> + + PR fortran/44207 + * resolve.c (conformable_arrays): Handle allocatable components. + 2010-06-10 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> PR fortran/38273 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 226c2f9..4b4c505 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -6146,8 +6146,11 @@ gfc_expr_to_initialize (gfc_expr *e) static gfc_try conformable_arrays (gfc_expr *e1, gfc_expr *e2) { + gfc_ref *tail; + for (tail = e2->ref; tail && tail->next; tail = tail->next); + /* First compare rank. */ - if (e2->ref && e1->rank != e2->ref->u.ar.as->rank) + if (tail && e1->rank != tail->u.ar.as->rank) { gfc_error ("Source-expr at %L must be scalar or have the " "same rank as the allocate-object at %L", @@ -6164,15 +6167,15 @@ conformable_arrays (gfc_expr *e1, gfc_expr *e2) for (i = 0; i < e1->rank; i++) { - if (e2->ref->u.ar.end[i]) + if (tail->u.ar.end[i]) { - mpz_set (s, e2->ref->u.ar.end[i]->value.integer); - mpz_sub (s, s, e2->ref->u.ar.start[i]->value.integer); + mpz_set (s, tail->u.ar.end[i]->value.integer); + mpz_sub (s, s, tail->u.ar.start[i]->value.integer); mpz_add_ui (s, s, 1); } else { - mpz_set (s, e2->ref->u.ar.start[i]->value.integer); + mpz_set (s, tail->u.ar.start[i]->value.integer); } if (mpz_cmp (e1->shape[i], s) != 0) |