+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
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;
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
--- /dev/null
+! { 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" } }
+
--- /dev/null
+! { 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
+