re PR fortran/80121 (Memory leak with derived-type intent(out) argument)
authorJanus Weil <janus@gcc.gnu.org>
Sun, 23 Apr 2017 08:26:50 +0000 (10:26 +0200)
committerJanus Weil <janus@gcc.gnu.org>
Sun, 23 Apr 2017 08:26:50 +0000 (10:26 +0200)
2017-04-22  Janus Weil  <janus@gcc.gnu.org>

PR fortran/80121
* trans-types.c (gfc_conv_procedure_call): Deallocate the components
of allocatable intent(out) arguments.

2017-04-22  Janus Weil  <janus@gcc.gnu.org>

PR fortran/80121
* gfortran.dg/intent_out_9.f90: New test case.

From-SVN: r247083

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

index 7058511d5655ed1e550b645500763292344bce66..b186bfd65aa321ea7d006575fb169d6fd3739e78 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-22  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/80121
+       * trans-types.c (gfc_conv_procedure_call): Deallocate the components
+       of allocatable intent(out) arguments.
+
 2017-04-21  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/80392
index 7bced25df4918a2a562ce7b418043e3ced9e8a67..af1549a611f56acc5e6bb85a5f5508fadadda2dc 100644 (file)
@@ -5454,6 +5454,16 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
              if (fsym && fsym->attr.allocatable
                  && fsym->attr.intent == INTENT_OUT)
                {
+                 if (fsym->ts.type == BT_DERIVED
+                     && fsym->ts.u.derived->attr.alloc_comp)
+                 {
+                   // deallocate the components first
+                   tmp = gfc_deallocate_alloc_comp (fsym->ts.u.derived,
+                                                    parmse.expr, e->rank);
+                   if (tmp != NULL_TREE)
+                     gfc_add_expr_to_block (&se->pre, tmp);
+                 }
+
                  tmp = build_fold_indirect_ref_loc (input_location,
                                                     parmse.expr);
                  if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp)))
index 39c270773f265f8d67a96eca15a4d3f924c0977a..27f5be805eceab1b93d25419651e236798e97e08 100644 (file)
@@ -1,3 +1,8 @@
+2017-04-22  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/80121
+       * gfortran.dg/intent_out_9.f90: New test case.
+
 2017-04-23  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/70799
diff --git a/gcc/testsuite/gfortran.dg/intent_out_9.f90 b/gcc/testsuite/gfortran.dg/intent_out_9.f90
new file mode 100644 (file)
index 0000000..e253692
--- /dev/null
@@ -0,0 +1,28 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-original" }
+!
+! PR 80121: Memory leak with derived-type intent(out) argument
+!
+! Contributed by Andrew Wood <andrew@fluidgravity.co.uk>
+
+PROGRAM p
+    IMPLICIT NONE
+    TYPE t1
+      INTEGER, ALLOCATABLE :: i(:)
+    END TYPE
+    call leak
+  CONTAINS
+    SUBROUTINE s1(e)
+      TYPE(t1), ALLOCATABLE, INTENT(OUT) :: e(:)
+      ALLOCATE( e(1) )
+      ALLOCATE( e(1)%i(2) )
+    END SUBROUTINE
+    SUBROUTINE leak
+      TYPE(t1), ALLOCATABLE :: e(:)
+      CALL s1(e)
+      CALL s1(e)
+    END SUBROUTINE
+END PROGRAM
+
+! { dg-final { scan-tree-dump-times "__builtin_free" 6 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }