]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/62309 (-fno-automatic with -finit-local prevents initialization of...
authorFritz Reese <Reese-Fritz@zai.com>
Sun, 31 Aug 2014 22:28:30 +0000 (22:28 +0000)
committerTobias Burnus <burnus@gcc.gnu.org>
Sun, 31 Aug 2014 22:28:30 +0000 (00:28 +0200)
2014-08-31  Fritz Reese  <Reese-Fritz@zai.com>

        PR fortran/62309
        * resolve.c (apply_default_init_local): Don't treat variables
        in RECURSIVE procedures as saved.

2014-08-31  Fritz Reese  <Reese-Fritz@zai.com>
            Tobias Burnus  <burnus@net-b.de>

        PR fortran/62309
        * gcc/testsuite/gfortran.dg/auto_save_2.f90: New.

Co-Authored-By: Tobias Burnus <burnus@net-b.de>
From-SVN: r214771

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/auto_save_2.f90 [new file with mode: 0644]

index 57b76bf7af38abb19ca9a26c5de9ac6af2a9a731..eab86ed371b05aa90718d85c43b8314a3483c24c 100644 (file)
@@ -1,3 +1,9 @@
+2014-08-31  Fritz Reese  <Reese-Fritz@zai.com>
+
+       PR fortran/62309
+       * resolve.c (apply_default_init_local): Don't treat variables
+       in RECURSIVE procedures as saved.
+
 2014-08-31  Tobias Burnus  <burnus@net-b.de>
 
        * trans-decl.c (gfc_build_builtin_function_decls): Add
index 52aae90ecc465416356b0a67edf9f18f0761a3db..da732db26ab9525028f35afe57137294acdbab70 100644 (file)
@@ -10780,6 +10780,7 @@ apply_default_init_local (gfc_symbol *sym)
      result variable, which are also nonstatic.  */
   if (sym->attr.save || sym->ns->save_all
       || (gfc_option.flag_max_stack_var_size == 0 && !sym->attr.result
+         && !sym->ns->proc_name->attr.recursive
          && (!sym->attr.dimension || !is_non_constant_shape_array (sym))))
     {
       /* Don't clobber an existing initializer!  */
index 8cc10e7f699dea18bc756bad3ed5a6b072041a8d..953eafd11f53ca69f943b122e27df778bf181d23 100644 (file)
@@ -1,3 +1,9 @@
+2014-08-31  Fritz Reese  <Reese-Fritz@zai.com>
+           Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/62309
+       * gcc/testsuite/gfortran.dg/auto_save_2.f90: New.
+
 2014-08-31  Tobias Burnus  <burnus@net-b.de>
 
        * gfortran.dg/coarray_lib_comm_1.f90: New.
diff --git a/gcc/testsuite/gfortran.dg/auto_save_2.f90 b/gcc/testsuite/gfortran.dg/auto_save_2.f90
new file mode 100644 (file)
index 0000000..07d5d0c
--- /dev/null
@@ -0,0 +1,84 @@
+! { dg-do run }
+! { dg-options "-fno-automatic -finit-local-zero -fdump-tree-original" }
+!
+! PR fortran/62309
+!
+! Make sure variables are saved with -fno-automatic except in
+! functions marked RECURSIVE, and that they are still initialized with
+! -finit-local-zero.
+!
+
+function f (x)
+implicit none
+  integer f, x
+  integer a ! should be SAVEd
+  a = a + x ! should increment by y every time
+  f = a
+  return
+endfunction
+
+function f2 (x)
+implicit none
+  integer f2, x
+  block
+   named: block
+    block
+    integer a ! should be SAVEd
+    a = a + x ! should increment by y every time
+    f2 = a
+    end block
+   end block named
+  end block
+  return
+endfunction
+
+recursive function g (x)
+implicit none
+  integer g, x
+  integer b ! should be automatic
+  b = b + x ! should be set to y every time
+  g = b
+  return
+endfunction
+
+recursive function g2 (x)
+implicit none
+  integer g2, x
+  block
+   named: block
+    block
+    integer b ! should be automatic
+    b = b + x ! should be set to y every time
+    g2 = b
+    end block
+   end block named
+  end block
+  return
+endfunction
+
+implicit none
+integer f, f2, g, g2
+
+! Should return static value of a; accumulates y
+if ( f(3) .ne. 3 ) call abort ()
+if ( f(4) .ne. 7 ) call abort ()
+if ( f(2) .ne. 9 ) call abort ()
+
+if ( f2(3) .ne. 3 ) call abort ()
+if ( f2(4) .ne. 7 ) call abort ()
+if ( f2(2) .ne. 9 ) call abort ()
+
+! Should return automatic value of a; equal to y each time
+if ( g(3) .ne. 3 ) call abort ()
+if ( g(4) .ne. 4 ) call abort ()
+if ( g(2) .ne. 2 ) call abort ()
+
+if ( g2(3) .ne. 3 ) call abort ()
+if ( g2(4) .ne. 4 ) call abort ()
+if ( g2(2) .ne. 2 ) call abort ()
+
+end
+
+! { dg-final { scan-tree-dump-times "  static integer\\\(kind=4\\\) a = 0;" 2 "original" } }
+! { dg-final { scan-tree-dump-times "  b = 0;" 2 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }