===================================================================
*************** resolve_variable (gfc_expr *e)
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)
===================================================================
***************
+ ! { dg-do compile }
+ !
+ ! Test the fix for PR56386
+ !
+ ! Contributed by Vladimir Fuka <vladimir.fuka@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
===================================================================
***************
+ ! { dg-do compile }
+ !
+ ! Tests the fix for PR80260
+ !
+ ! Contributed by Damian Rouson <damian@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
===================================================================
***************
+ ! { dg-do compile }
+ !
+ ! Tests the fix for PR82077
+ !
+ ! Contributed by Damian Rouson <damian@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