re PR fortran/66082 (memory leak with automatic array dummy argument with derived type array constructor actual argument)
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
This commit is contained in:
parent
4a72a6ddd2
commit
1b961de9db
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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" } }
|
Loading…
Reference in New Issue