aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2010-06-11 03:42:38 +0200
committerJanus Weil <janus@gcc.gnu.org>2010-06-11 03:42:38 +0200
commit66051b6074a5641299738aa1d698fc63175ca0de (patch)
tree3ccb6e0dea334cf04217c071950acf1dd21e2670 /gcc/fortran
parent328f6bf1de6d083acd24f0436c699d761bf58dc7 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/fortran/resolve.c13
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)