This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
[patch, fortran] Fix PR 55314, rejects-valid regression
- From: Thomas Koenig <tkoenig at netcologne dot de>
- To: "fortran at gcc dot gnu dot org" <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Sat, 24 Nov 2012 13:30:33 +0100
- Subject: [patch, fortran] Fix PR 55314, rejects-valid regression
Hello world,
the attached patch fixes a 4.6/4.7/4.8 rejects-valid regression.
OK for trunk?
Thomas
2012-11-24 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/55314
* resolve.c (resolve_allocate_deallocate): Compare all
subscripts when deciding if to reject a (de)allocate
statement.
2012-11-24 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/55314
* gfortran.dg/allocate_error_4.f90: New test.
! { dg-do compile }
! PR fortran/55314 - the second allocate statement was rejected.
program main
implicit none
integer :: max_nb
type comm_mask
integer(4), pointer :: mask(:)
end type comm_mask
type (comm_mask), allocatable, save :: encode(:,:)
max_nb=2
allocate( encode(1:1,1:max_nb))
allocate( encode(1,1)%mask(1),encode(1,2)%mask(1))
deallocate( encode(1,1)%mask,encode(1,2)%mask)
allocate( encode(1,1)%mask(1),encode(1,1)%mask(1)) ! { dg-error "also appears at" }
end program main
Index: resolve.c
===================================================================
--- resolve.c (Revision 192894)
+++ resolve.c (Arbeitskopie)
@@ -7618,12 +7618,18 @@ resolve_allocate_deallocate (gfc_code *code, const
if (pr->next && qr->next)
{
+ int i;
gfc_array_ref *par = &(pr->u.ar);
gfc_array_ref *qar = &(qr->u.ar);
- if ((par->start[0] != NULL || qar->start[0] != NULL)
- && gfc_dep_compare_expr (par->start[0],
- qar->start[0]) != 0)
- break;
+
+ for (i=0; i<par->dimen; i++)
+ {
+ if ((par->start[i] != NULL
+ || qar->start[i] != NULL)
+ && gfc_dep_compare_expr (par->start[i],
+ qar->start[i]) != 0)
+ goto break_label;
+ }
}
}
else
@@ -7635,6 +7641,8 @@ resolve_allocate_deallocate (gfc_code *code, const
pr = pr->next;
qr = qr->next;
}
+ break_label:
+ ;
}
}
}