[flang] Call finalization on empty type (#66010)

According to 7.5.6.3 point 3, finalization occurs when

> A nonpointer, nonallocatable object that is not a dummy argument or
function result is finalized immediately before it would become
undefined due to execution of a RETURN or END statement (19.6.6, item
(3)).

We were not calling the finalization on empty derived-type. There is no
such restriction so this patch updates the code so the finalization is
called for empty type as well.
This commit is contained in:
Valentin Clement (バレンタイン クレメン) 2023-09-11 14:34:21 -07:00 committed by GitHub
parent e6e69f3bd4
commit 973ca4e4a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 1 deletions

View File

@ -88,7 +88,7 @@ static bool hasDefaultInitialization(const Fortran::semantics::Symbol &sym) {
// Does this variable have a finalization?
static bool hasFinalization(const Fortran::semantics::Symbol &sym) {
if (sym.has<Fortran::semantics::ObjectEntityDetails>() && sym.size())
if (sym.has<Fortran::semantics::ObjectEntityDetails>())
if (const Fortran::semantics::DeclTypeSpec *declTypeSpec = sym.GetType())
if (const Fortran::semantics::DerivedTypeSpec *derivedTypeSpec =
declTypeSpec->AsDerived())

View File

@ -23,6 +23,11 @@ module derived_type_finalization
type(t2) :: t
end type
type t4
contains
final :: t4_final
end type
contains
subroutine t1_final(this)
@ -227,6 +232,17 @@ contains
! CHECK: %[[RES_CONV:.*]] = fir.convert %[[RES]] : (!fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>>>) -> !fir.box<none>
! CHECK: %{{.*}} = fir.call @_FortranADestroy(%[[RES_CONV]]) {{.*}} : (!fir.box<none>) -> none
subroutine t4_final(this)
type(t4) :: this
end subroutine
subroutine local_t4()
type(t4) :: t
end subroutine
! CHECK-LABEL: func.func @_QMderived_type_finalizationPlocal_t4()
! CHECK: %{{.*}} = fir.call @_FortranADestroy(%2) fastmath<contract> : (!fir.box<none>) -> none
end module
program p