From e4a5f73449d7352ba8128fecbc9a9570d746abdb Mon Sep 17 00:00:00 2001 From: Mark Eggleston Date: Fri, 17 Jan 2020 08:49:25 +0000 Subject: [PATCH] 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. --- gcc/fortran/ChangeLog | 8 +++++++ gcc/fortran/resolve.c | 3 ++- gcc/testsuite/ChangeLog | 7 ++++++ gcc/testsuite/gfortran.dg/pr93263_1.f90 | 29 +++++++++++++++++++++++++ gcc/testsuite/gfortran.dg/pr93263_2.f90 | 24 ++++++++++++++++++++ 5 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/pr93263_1.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr93263_2.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 889f01bce26..524ebff3e1f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2020-01-17 Mark Eggleston + + 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 PR fortran/93253 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 6f2a4c4d65a..bddab39d023 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5bd1ab21271..4247302bda9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2020-01-17 Mark Eggleston + Tobias Burnus + + PR fortran/93236 + * gfortran.dg/pr93263_1.f90: New test. + * gfortran.dg/pr93263_2.f90: New test. + 2020-01-17 Jakub Jelinek PR tree-optimization/93292 diff --git a/gcc/testsuite/gfortran.dg/pr93263_1.f90 b/gcc/testsuite/gfortran.dg/pr93263_1.f90 new file mode 100644 index 00000000000..f96b3589411 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr93263_1.f90 @@ -0,0 +1,29 @@ +! { dg-do compile } +! { dg-options "-fno-automatic -fdump-tree-original" } +! +! Test contributed by Mark Eggleston + +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" } } + diff --git a/gcc/testsuite/gfortran.dg/pr93263_2.f90 b/gcc/testsuite/gfortran.dg/pr93263_2.f90 new file mode 100644 index 00000000000..fd353c6b548 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr93263_2.f90 @@ -0,0 +1,24 @@ +! { dg-do run } +! +! Test contributed by Tobias Burnus + + 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 + -- 2.30.2