[Bug fortran/80477] [OOP] Polymorphic function result generates memory leak

janus at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sat Apr 22 11:18:00 GMT 2017


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80477

janus at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2017-04-22
                 CC|                            |janus at gcc dot gnu.org
   Target Milestone|---                         |8.0
            Summary|Polymorphic functions (thus |[OOP] Polymorphic function
                   |operators) generates memory |result generates memory
                   |leaks                       |leak
     Ever confirmed|0                           |1

--- Comment #3 from janus at gcc dot gnu.org ---
Confirmed. Here is the most reduced test case I could construct from your
original example:


module a_type_m
   implicit none
   type :: a_type_t
      real :: x
   endtype
contains
   subroutine assign_a_type(lhs, rhs)
      type(a_type_t), intent(inout) :: lhs
      type(a_type_t), intent(in)    :: rhs
      lhs%x = rhs%x
   end subroutine

   function add_a_type(lhs, rhs) result( res )
      type(a_type_t), intent(in)  :: lhs
      type(a_type_t), intent(in)  :: rhs
      class(a_type_t), allocatable :: res
      allocate (a_type_t :: res)
      res%x = lhs%x + rhs%x
   end function
end module

program polymorphic_operators_memory_leaks
   use a_type_m
   implicit none
   type(a_type_t) :: a = a_type_t(1) , b = a_type_t(2)
   call assign_a_type (a, add_a_type(a,b))              ! generates memory leak
end


valgrind shows the following output for all gfortran versions I tried (from 4.7
to trunk):

==6131== HEAP SUMMARY:
==6131==     in use at exit: 4 bytes in 1 blocks
==6131==   total heap usage: 20 allocs, 19 frees, 12,012 bytes allocated
==6131== 
==6131== LEAK SUMMARY:
==6131==    definitely lost: 4 bytes in 1 blocks
==6131==    indirectly lost: 0 bytes in 0 blocks


I think it's indeed a duplicate of PR 60913.


More information about the Gcc-bugs mailing list