re PR fortran/53389 (-frealloc-lhs: memory leak when assigning array function result to allocatable array, where one of its supplied arguments is itself an array function result)

2012-05-22  Tobias Burnus  <burnus@net-b.de>

        PR fortran/53389
        * trans-array.c (gfc_add_loop_ss_code): Don't evaluate
        * expression, if
        ss->is_alloc_lhs is set.

2012-05-22  Tobias Burnus  <burnus@net-b.de>

        PR fortran/53389
        * gfortran.dg/realloc_on_assign_15.f90: New.

From-SVN: r187769
This commit is contained in:
Tobias Burnus 2012-05-22 12:10:47 +02:00
parent 633d9236a1
commit f391a85582
4 changed files with 58 additions and 2 deletions

View File

@ -1,8 +1,14 @@
2012-05-22 Tobias Burnus <burnus@net-b.de>
PR fortran/53389
* trans-array.c (gfc_add_loop_ss_code): Don't evaluate expression, if
ss->is_alloc_lhs is set.
2012-05-22 Dodji Seketeli <dodji@redhat.com>
PR c++/53322
* f95-lang.c (gfc_init_builtin_functions): Remove the unused
typedef builtin_type.
typedef builtin_type.
2012-05-14 Janne Blomqvist <jb@gcc.gnu.org>

View File

@ -2401,6 +2401,11 @@ gfc_add_loop_ss_code (gfc_loopinfo * loop, gfc_ss * ss, bool subscript,
bool skip_nested = false;
int n;
/* Don't evaluate the arguments for realloc_lhs_loop_for_fcn_call; otherwise,
arguments could get evaluated multiple times. */
if (ss->is_alloc_lhs)
return;
outer_loop = outermost_loop (loop);
/* TODO: This can generate bad code if there are ordering dependencies,

View File

@ -1,3 +1,8 @@
2012-05-22 Tobias Burnus <burnus@net-b.de>
PR fortran/53389
* gfortran.dg/realloc_on_assign_15.f90: New.
2012-05-22 Richard Guenther <rguenther@suse.de>
PR middle-end/51071
@ -12,7 +17,7 @@
PR c++/53322
* g++.dg/warn/Wunused-local-typedefs.C: Adjust to use -Wunused
instead of -Wunused-local-typedefs.
instead of -Wunused-local-typedefs.
2012-05-21 Paolo Carlini <paolo.carlini@oracle.com>

View File

@ -0,0 +1,40 @@
! { dg-do run }
!
! PR fortran/53389
!
! The program was leaking memory before due to
! realloc on assignment and nested functions.
!
module foo
implicit none
contains
function filler(array, val)
real, dimension(:), intent(in):: array
real, dimension(size(array)):: filler
real, intent(in):: val
filler=val
end function filler
end module
program test
use foo
implicit none
real, dimension(:), allocatable:: x, y
integer, parameter:: N=1000 !*1000
integer:: i
! allocate( x(N) )
allocate( y(N) )
y=0.0
do i=1, N
! print *,i
x=filler(filler(y, real(2*i)), real(i))
y=y+x
end do
end program test