[Patch, fortran] PR66082 - memory leak with automatic array dummy argument with derived type array constructor actual argument

Paul Richard Thomas paul.richard.thomas@gmail.com
Mon May 25 12:09:00 GMT 2015


Dear All,

The attached patch fixes another memory leak problem, reported by
Damian. It is sufficiently obvious that the patch explains itself.

Bootstrapped and regtested on x86_64/FC21 - OK for trunk?

Cheers

Paul

2015-05-25  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-25  Paul Thomas  <pault@gcc.gnu.org>

    PR fortran/66082
    * gfortran.dg/allocatable_scalar_13.f90: New test
-------------- next part --------------
Index: gcc/fortran/trans-array.c
===================================================================
*** gcc/fortran/trans-array.c	(revision 223641)
--- gcc/fortran/trans-array.c	(working copy)
*************** gfc_conv_resolve_dependencies (gfc_loopi
*** 4458,4464 ****
  	  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;
--- 4458,4464 ----
  	  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;
*************** gfc_conv_array_parameter (gfc_se * se, g
*** 7267,7272 ****
--- 7267,7283 ----
    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: gcc/testsuite/gfortran.dg/alloc_comp_auto_array_3.f90
===================================================================
*** gcc/testsuite/gfortran.dg/alloc_comp_auto_array_3.f90	(revision 0)
--- gcc/testsuite/gfortran.dg/alloc_comp_auto_array_3.f90	(working copy)
***************
*** 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" } }


More information about the Fortran mailing list