(j3.2006) Finalizing subroutines question

Tobias Burnus burnus
Fri May 23 11:00:45 EDT 2008


This came up when implementing FINAL in gfortran. (Found by Daniel 
Kraft, who works on it.)

In Fortran 2003 and 2008 CD one finds:

"C473 (R454) A final-subroutine-name shall be the name of a module 
procedure with exactly one dummy argument. That argument shall be 
nonoptional and shall be a nonpointer, nonallocatable, nonpolymorphic 
variable of the derived type being defined. All length type parameters 
of the dummy argument shall be assumed. The dummy argument shall not be 

This implies that the following dummy arguments are all valid for the 
final subroutine (chose one at a time):

type(t) :: x(:)
type(t) :: x(*)
type(t) :: x(5)

Assuming that one has:

subroutine t_finalize(x)
  type(t) :: x(100)
end subroutine

and uses

type(t) :: myT(5)

Does this mean that on finalizing "t_finalize" is called? According to

"If the dynamic type of the entity has a final subroutine whose dummy 
argument has the same kind type parameters and rank as the entity being 
finalized, it is called with the entity as an actual argument."

I think this applies here. Am I misreading something or is this indeed 
the case? (If I could choose, I'd liked that the dummy argument is 
required to have either a scalar or has assumed shape.)


More information about the J3 mailing list