[Bug fortran/86206] ICE in gfc_resolve_forall, at fortran/resolve.c:9989

kargl at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Apr 30 17:00:39 GMT 2021


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86206

kargl at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kargl at gcc dot gnu.org

--- Comment #5 from kargl at gcc dot gnu.org ---
(In reply to Jürgen Reuter from comment #4)
> Still present in v12.0.

First, I recognize that the submitted code is likely a severely reduced
testcase to demonstrate the bug.

Because FORALL is now listed as an obsolescent feature, I predict that this bug
will never be fixed unless someone who is keenly interested in FORALL steps up.

The issue is in resolve.c(gfc_resolve_forall) where static variables are used
to track nested FORALL statements.  The nesting is assumed to be of the form:

   pure function zero_matrix(xx) result(ret)
     real , intent(in) :: xx(:,:)
     real :: ret(size(xx,1),size(xx,2))
     integer :: i,j
     forall (i=1:size(xx,1),j=1:size(xx,2)) ret(i,j) = 0
   end function zero_matrix

or maybe

   pure function zeroing(xx) result(ret)
      real , intent(in) :: xx(:,:)
      real :: ret(size(xx,1),size(xx,2))
      integer :: i,j
      a: forall (j=1:size(xx,2))
         b: forall (i=1:size(xx,1))
            ret(i,j) = 0
         end forall b
      end forall a
   end function zeroing

Here, the I and J variables are tracked, where gfc_resolve_forall()
is called recursively.

I'm guessing that the single line nature of your zero_mat() function
does not properly reset the static variables.  This would look like

     a: forall (j=1:size(xx,2))
         b: forall (i=1:size(xx,1))
            ret(i,j) = 0
     end forall a
 or

     a: forall (j=1:size(xx,2))
         b: forall (i=1:size(xx,1))
            ret(i,j) = 0
         end forall b

with a missing closing END FORALL.  gfortran, of course, catches the
missing END FORALL because it is not parsing in the single-line FORALL
mode.


More information about the Gcc-bugs mailing list