aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Eggleston <markeggleston@gcc.gnu.org>2020-01-17 08:49:25 +0000
committerMark Eggleston <markeggleston@gcc.gnu.org>2020-01-17 08:49:33 +0000
commite4a5f73449d7352ba8128fecbc9a9570d746abdb (patch)
treebeea2fb70aa72f40643b7a8517aa70dc0f0f919a /gcc
parentdc9ba9d045d0cfc06207806fd64b06ab3304b196 (diff)
downloadgcc-e4a5f73449d7352ba8128fecbc9a9570d746abdb.zip
gcc-e4a5f73449d7352ba8128fecbc9a9570d746abdb.tar.gz
gcc-e4a5f73449d7352ba8128fecbc9a9570d746abdb.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/resolve.c3
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/pr93263_1.f9029
-rw-r--r--gcc/testsuite/gfortran.dg/pr93263_2.f9024
5 files changed, 70 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 889f01b..524ebff 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,11 @@
+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
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 6f2a4c4..bddab39 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 5bd1ab2..4247302 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+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
diff --git a/gcc/testsuite/gfortran.dg/pr93263_1.f90 b/gcc/testsuite/gfortran.dg/pr93263_1.f90
new file mode 100644
index 0000000..f96b358
--- /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 <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" } }
+
diff --git a/gcc/testsuite/gfortran.dg/pr93263_2.f90 b/gcc/testsuite/gfortran.dg/pr93263_2.f90
new file mode 100644
index 0000000..fd353c6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr93263_2.f90
@@ -0,0 +1,24 @@
+! { 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
+