http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58229
janus at gcc dot gnu.org changed:
What|Removed |Added
Keywords||wrong-code
Status|UNCONFIRMED |NEW
Last reconfirmed||2013-08-23
CC||janus at gcc dot gnu.org
Summary|Memory leak with overloaded |[F03] Memory leak with
|operator|allocatable function result
Ever confirmed|0 |1
--- Comment #1 from janus at gcc dot gnu.org ---
Confirmed. Reduced test case:
implicit none
type :: pointtype
real :: x = 0, y = 0, z = 0
end type
integer :: i, j
real :: x(3)
type(pointtype), allocatable :: a(:,:)
allocate (a(10,10))
do j = 1, SIZE(a,2)
do i = 1, SIZE(a, 1)
call RANDOM_NUMBER(x)
a(i,j) = pointtype(x(1), x(2), x(3))
a(i,j) = scalar_times_point (2. , a(i,j))
enddo
enddo
contains
function scalar_times_point(scalar, point) result(res)
type(pointtype), allocatable :: res
real, intent(IN) :: scalar
type(pointtype), intent(IN) :: point
res = pointtype(point%x * scalar, point%y * scalar, point%z * scalar)
end function
end
It is not really connected to operators, but rather to allocatable function
results in general. The variant above shows two leaks with 4.9 trunk:
==31477== 1,200 bytes in 1 blocks are definitely lost in loss record 1 of 2
==31477==at 0x4C2C27B: malloc (in
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==31477==by 0x400986: MAIN__ (c0.f90:11)
==31477==by 0x400C9E: main (c0.f90:13)
==31477==
==31477== 1,200 bytes in 100 blocks are definitely lost in loss record 2 of 2
==31477==at 0x4C2C27B: malloc (in
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==31477==by 0x400898: scalar_times_point.1878 (c0.f90:27)
==31477==by 0x400C0E: MAIN__ (c0.f90:17)
==31477==by 0x400C9E: main (c0.f90:13)
The first one is the ALLOCATE in the main program, which (according to F08) is
*not* required to be auto-deallocated (4.8 does it, but 4.9 doesn't, so this
explains the difference between the two). This is not a bug.
The second one is the allocate-on-assignment inside the function, which nevers
gets freed. This *is* a bug. What should be done is: Create a temporary for the
function result and free it after the call. This is also one of the cases where
finalization still needs to be handled (cf. PR 37336).