When avoiding double deallocation, look at namespace, expression and component.
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 14 Jun 2020 11:01:24 +0000 (13:01 +0200)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 14 Jun 2020 11:01:24 +0000 (13:01 +0200)
commit1af22e455584ef5fcad2b4474c1efc3fd26f6cb3
tree769ed6b4561d0635ea175b5a1b496690efc39c75
parent275bef5fbae9d1e22885c581cfbe6fc5248ca8ad
When avoiding double deallocation, look at namespace, expression and component.

Our finalization handling is a mess.  Really, we should get to try and get
this fixed for gcc 11.

In the meantime, here is a patch which fixes a regression I introduced
when fixing a regression with a memory leak.  The important thing
here is to realize that we do not need to finalize (and deallocate)
multiple times for the same expression and the same component
in the same namespace.  It might cause code size regressions, but
better big code than wrong code...

gcc/fortran/ChangeLog:

PR fortran/94109
* class.c (finalize_component): Return early if finalization has
already happened for expression and component within namespace.
* gfortran.h (gfc_was_finalized): New type.
(gfc_namespace): Add member was_finalzed.
(gfc_expr): Remove finalized.
* symbol.c (gfc_free_namespace): Free was_finalized.

gcc/testsuite/ChangeLog:

PR fortran/94109
* gfortran.dg/finalize_34.f90: Adjust free counts.
* gfortran.dg/finalize_36.f90: New test.
gcc/fortran/class.c
gcc/fortran/gfortran.h
gcc/fortran/symbol.c
gcc/testsuite/gfortran.dg/finalize_34.f90
gcc/testsuite/gfortran.dg/finalize_36.f90 [new file with mode: 0644]