re PR fortran/66082 (memory leak with automatic array dummy argument with derived...
authorPaul Thomas <pault@gcc.gnu.org>
Tue, 26 May 2015 10:20:41 +0000 (10:20 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Tue, 26 May 2015 10:20:41 +0000 (10:20 +0000)
2015-05-26  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/66082
* trans-array.c (gfc_conv_array_parameter): Ensure that all
non-variable arrays with allocatable components have the
components deallocated after the procedure call.

2015-05-26  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/66082
* gfortran.dg/allocatable_scalar_13.f90: New test

From-SVN: r223677

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/alloc_comp_auto_array_3.f90 [new file with mode: 0644]

index bc623c4dbdea8e27fb0c344dcd7fcf4bbc89f9d8..0bada49d283191a2fb82231f7e3b97a68e00c1ba 100644 (file)
@@ -1,3 +1,10 @@
+2015-05-26  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/66082
+       * trans-array.c (gfc_conv_array_parameter): Ensure that all
+       non-variable arrays with allocatable components have the
+       components deallocated after the procedure call.
+
 2015-05-24  Mikael Morin  <mikael@gcc.gnu.org>
 
        PR fortran/66257
index e6edf742377ec32caff7e465b79cfa05a4007ea5..c8fab454249227bf42510c93a9171b46bade7e79 100644 (file)
@@ -4458,7 +4458,7 @@ gfc_conv_resolve_dependencies (gfc_loopinfo * loop, gfc_ss * dest,
          if (!nDepend && dest_expr->rank > 0
              && dest_expr->ts.type == BT_CHARACTER
              && ss_expr->expr_type == EXPR_VARIABLE)
-           
+
            nDepend = gfc_check_dependency (dest_expr, ss_expr, false);
 
          continue;
@@ -7267,6 +7267,17 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
   if (no_pack || array_constructor || good_allocatable || ultimate_alloc_comp)
     {
       gfc_conv_expr_descriptor (se, expr);
+      /* Deallocate the allocatable components of structures that are
+        not variable.  */
+      if ((expr->ts.type == BT_DERIVED || expr->ts.type == BT_CLASS)
+          && expr->ts.u.derived->attr.alloc_comp
+          && expr->expr_type != EXPR_VARIABLE)
+       {
+         tmp = gfc_deallocate_alloc_comp (expr->ts.u.derived, se->expr, expr->rank);
+
+         /* The components shall be deallocated before their containing entity.  */
+         gfc_prepend_expr_to_block (&se->post, tmp);
+       }
       if (expr->ts.type == BT_CHARACTER)
        se->string_length = expr->ts.u.cl->backend_decl;
       if (size)
index aeb7308fbeba50a3813bcc1b40331e7fd0f4ceae..ccfca6add5971bad90bad5e8a192e3b6749bcfeb 100644 (file)
@@ -1,3 +1,8 @@
+2015-05-26  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/66082
+       * gfortran.dg/allocatable_scalar_13.f90: New test
+
 2015-05-25  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/warn11.adb: New test.
diff --git a/gcc/testsuite/gfortran.dg/alloc_comp_auto_array_3.f90 b/gcc/testsuite/gfortran.dg/alloc_comp_auto_array_3.f90
new file mode 100644 (file)
index 0000000..5783513
--- /dev/null
@@ -0,0 +1,30 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-original" }
+!
+! Test the fix for PR66082. The original problem was with the first
+! call foo_1d.
+!
+! Reported by Damian Rouson  <damian@sourceryinstitute.org>
+!
+  type foo_t
+    real, allocatable :: bigarr
+  end type
+  block
+    type(foo_t) :: foo
+    allocate(foo%bigarr)
+    call foo_1d (1,[foo]) ! wasy lost
+    call foo_1d (1,bar_1d()) ! Check that this is OK
+  end block
+contains
+  subroutine foo_1d (n,foo)
+    integer n
+    type(foo_t) :: foo(n)
+  end subroutine
+  function bar_1d () result (array)
+    type(foo_t) :: array(1)
+    allocate (array(1)%bigarr)
+  end function
+end
+! { dg-final { scan-tree-dump-times "builtin_malloc" 3 "original" } }
+! { dg-final { scan-tree-dump-times "builtin_free" 4 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }