[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