Commit e4a5f734 by Mark Eggleston

PATCH] Fortran: PR93263 -fno-automatic and RECURSIVE

The use of -fno-automatic should not affect the save attribute of a
recursive procedure. The first test case checks unsaved variables
and the second checks saved variables.
parent dc9ba9d0
2020-01-17 Mark Eggleston <mark.eggleston@codethink.com>
PR fortran/93236
* resolve.c (resolve_types): Declare boolean recursive and set with the
value of the recursive attribute of namespace proc_name symbol
structure if it exists. Call gfc_save_all if both flag_automatic and
recursive are false or ns->save_all is true.
2020-01-16 Tobias Burnus <tobias@codesourcery.com>
PR fortran/93253
......
......@@ -17079,6 +17079,7 @@ resolve_types (gfc_namespace *ns)
gfc_data *d;
gfc_equiv *eq;
gfc_namespace* old_ns = gfc_current_ns;
bool recursive = ns->proc_name && ns->proc_name->attr.recursive;
if (ns->types_resolved)
return;
......@@ -17132,7 +17133,7 @@ resolve_types (gfc_namespace *ns)
gfc_traverse_ns (ns, resolve_values);
if (ns->save_all || !flag_automatic)
if (ns->save_all || (!flag_automatic && !recursive))
gfc_save_all (ns);
iter_stack = NULL;
......
2020-01-17 Mark Eggleston <mark.eggleston@codethink.com>
Tobias Burnus <burnus@gcc.gnu.org>
PR fortran/93236
* gfortran.dg/pr93263_1.f90: New test.
* gfortran.dg/pr93263_2.f90: New test.
2020-01-17 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/93292
......
! { dg-do compile }
! { dg-options "-fno-automatic -fdump-tree-original" }
!
! Test contributed by Mark Eggleston <mark.eggleston@codethink.com>
program main
implicit none
call check(2)
end
recursive subroutine check(n)
implicit none
integer n, a
a = 10
print*,"n=",n
if (n==1) then
a=a-1
print*,"assigning a=",a
else
a=a-2
print*,"assigning a=",a
call check(n-1)
endif
print*,"a=",a
end
! { dg-final { scan-tree-dump-not "static integer\\(kind=4\\) a" "original" } }
! { dg-final { scan-tree-dump-not "integer\\(kind=4\\) a" "original" } }
! { dg-do run }
!
! Test contributed by Tobias Burnus <burnus@gcc.gnu.org>
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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment