mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-04 16:41:43 +00:00
[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:
parent
e6e69f3bd4
commit
973ca4e4a2
@ -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())
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user