This is a semi-obvious patch that fixes no fewer than five PRs: 56386, 58906, 77385, 80260 & 82077. The last two are marked as 7/8/9 regressions and so, although I haven't tested it yet, I suppose that the others must be too. Thanks to Dominique for picking up the other four PRs that are fixed by this patch.
Bootstrapped and regtested on FC28/x86_64 - OK for trunk, then 7- and 8-branches? Paul 2018-10-16 Paul Thomas <pa...@gcc.gnu.org> PR fortran/56386 PR fortran/58906 PR fortran/77385 PR fortran/80260 PR fortran/82077 * resolve.c (resolve_variable): Fix up expressions with array associate names, where the parser did not detect that this is array and there was no array part_ref in the expression. 2018-10-16 Paul Thomas <pa...@gcc.gnu.org> PR fortran/56386 PR fortran/58906 PR fortran/77385 * gfortran.dg/associate_44.f90 : New test. PR fortran/80260 * gfortran.dg/select_type_45.f90 : New test. PR fortran/82077 * gfortran.dg/select_type_46.f90 : New test.
Index: gcc/fortran/resolve.c =================================================================== *** gcc/fortran/resolve.c (revision 265171) --- gcc/fortran/resolve.c (working copy) *************** resolve_variable (gfc_expr *e) *** 5436,5441 **** --- 5436,5459 ---- gfc_fix_class_refs (e); if (!sym->attr.dimension && e->ref && e->ref->type == REF_ARRAY) return false; + else if (sym->attr.dimension && (!e->ref || e->ref->type != REF_ARRAY)) + { + /* This can happen because the parser did not detect that the + associate name is an array and the expression had no array + part_ref. */ + gfc_ref *ref = gfc_get_ref (); + ref->type = REF_ARRAY; + ref->u.ar = *gfc_get_array_ref(); + ref->u.ar.type = AR_FULL; + if (sym->as) + { + ref->u.ar.as = sym->as; + ref->u.ar.dimen = sym->as->rank; + } + ref->next = e->ref; + e->ref = ref; + + } } if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.generic) Index: gcc/testsuite/gfortran.dg/associate_44.f90 =================================================================== *** gcc/testsuite/gfortran.dg/associate_44.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/associate_44.f90 (working copy) *************** *** 0 **** --- 1,23 ---- + ! { dg-do compile } + ! + ! Test the fix for PR56386 + ! + ! Contributed by Vladimir Fuka <vladimir.f...@gmail.com> + ! + subroutine CustomSolidBodies + implicit none + + type inner + real :: elev + end type + + type :: outer + type(inner),dimension(0) :: PrPoints + end type + + type(outer) :: SB + + associate (Prter=>SB%PrPoints) + PrTer%elev=0 ! ICE here + end associate + end subroutine CustomSolidBodies Index: gcc/testsuite/gfortran.dg/select_type_45.f90 =================================================================== *** gcc/testsuite/gfortran.dg/select_type_45.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/select_type_45.f90 (working copy) *************** *** 0 **** --- 1,22 ---- + ! { dg-do compile } + ! + ! Tests the fix for PR80260 + ! + ! Contributed by Damian Rouson <dam...@sourceryinstitute.org> + ! + type foo + end type foo + type, extends(foo) :: bar + end type + contains + subroutine f(x) + class(foo) x(:,:) + select type(x) + class is (bar) + call g(x(1,:)) ! ICEd here. + end select + end subroutine + subroutine g(y) + class(bar) y(:) + end subroutine + end Index: gcc/testsuite/gfortran.dg/select_type_46.f90 =================================================================== *** gcc/testsuite/gfortran.dg/select_type_46.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/select_type_46.f90 (working copy) *************** *** 0 **** --- 1,21 ---- + ! { dg-do compile } + ! + ! Tests the fix for PR82077 + ! + ! Contributed by Damian Rouson <dam...@sourceryinstitute.org> + ! + type parent + end type parent + type, extends(parent) :: child + end type + class(parent), allocatable :: foo(:,:) + allocate(child::foo(1,1)) + select type(foo) + class is (child) + call gfortran7_ICE(foo(1,:)) ! ICEd here. + end select + contains + subroutine gfortran7_ICE(bar) + class(child) bar(:) + end subroutine + end