! { dg-do compile } ! { dg-options "-fdump-tree-original" } ! ! Test conformance with clause 7.5.6.3, paragraph 6 of F2018. Part of PR106576. ! ! Contributed by Damian Rouson ! module finalizable_m !! This module supports the main program at the bottom of this file, which !! tests compiler conformance with clause 7.5.6.3, paragraph 6 in the Fortran !! Interpretation Document (https://j3-fortran.org/doc/year/18/18-007r1.pdf): !! "If a specification expression in a scoping unit references !! a function, the result is finalized before execution of the executable !! constructs in the scoping unit." implicit none private public :: finalizable_t, component type finalizable_t private integer, allocatable :: component_ contains final :: finalize end Type interface finalizable_t module procedure construct end interface contains pure function construct(component) result(finalizable) integer, intent(in) :: component type(finalizable_t) finalizable allocate(finalizable%component_, source = component) end function pure function component(self) result(self_component) type(finalizable_t), intent(in) :: self integer self_component self_component = self%component_ end function pure subroutine finalize(self) type(finalizable_t), intent(inout) :: self if (allocated(self%component_)) deallocate(self%component_) end subroutine end module program specification_expression_finalization use finalizable_m, only : finalizable_t, component implicit none call finalize_specification_expression_result contains subroutine finalize_specification_expression_result real tmp(component(finalizable_t(component=1))) !! Finalizes the finalizable_t function result real eliminate_unused_variable_warning tmp = eliminate_unused_variable_warning end subroutine end program ! { dg-final { scan-tree-dump-times "_final != 0B" 1 "original" } }