[fortran] PR56386 - [F03] ICE with ASSOCIATE construct and an derived type array component

Message ID CAGkQGiJ72F_hd-TOwSmnXbTVyYhMuDoJHRP9J2ERkK+NE1f5Rw@mail.gmail.com
State New
Headers show
Series
  • [fortran] PR56386 - [F03] ICE with ASSOCIATE construct and an derived type array component
Related show

Commit Message

Paul Richard Thomas Oct. 16, 2018, 7:06 p.m.
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  <pault@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  <pault@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.

Comments

Tobias Burnus Oct. 16, 2018, 8:44 p.m. | #1
Paul Richard Thomas wrote:

> 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?


OK – but it is really only semi-obvious.

Tobias

> 2018-10-16  Paul Thomas  <pault@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  <pault@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.

Patch

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.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
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  <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
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  <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