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

--- Comment #5 from Tobias Burnus <burnus at gcc dot gnu.org> ---
(In reply to markeggleston from comment #4)
> -  if (ns->save_all || !flag_automatic)
> +  if (!recursive && (ns->save_all || !flag_automatic))

> Does the trick. Now need to write the test cases and prepare a patch.

I wonder whether it should be rather:
  if (ns->save_all || (!flag_automatic && !recursive))

I think your patch would break for the following code. And I believe it is
standard conform Fortran 90/2018:

  integer :: cnt
  cnt = 0
  call sub()
  if (cnt /= 5) stop 1
contains
  recursive subroutine sub()
    save
    logical :: first = .true.
    integer :: i
    cnt = cnt + 1
    if (first) then
      first = .false.
      i = 1
    end if
    print *, "Hello", i
    i = i + 1
    if (i <= 5) call sub()
  end subroutine
end

 * * *

Side remark: The Fortran 2018 introduction states:

"the RECURSIVE keyword is advisory only. The NON_RECURSIVE keyword specifies
that a procedure is not recursive."

Hence, I wonder whether this is correctly implemented in gfortran …

Reply via email to