! Test HLFIR lowering of user defined elemental procedure references ! with finalizable results. Verify that the elemental results ! are not destroyed inside hlfir.elemental. ! RUN: bbc -emit-hlfir -o - -I nowhere %s 2>&1 | FileCheck %s module types type t contains final :: finalize end type t contains pure subroutine finalize(x) type(t), intent(inout) :: x end subroutine finalize end module types subroutine test1(x) use types interface elemental function elem(x) use types type(t), intent(in) :: x type(t) :: elem end function elem end interface type(t) :: x(:) x = elem(x) end subroutine test1 ! CHECK-LABEL: func.func @_QPtest1( ! CHECK: %[[VAL_6:.*]] = hlfir.elemental %{{.*}} : (!fir.shape<1>) -> !hlfir.expr> { ! CHECK-NOT: fir.call @_FortranADestroy ! CHECK: hlfir.destroy %[[VAL_6]] finalize : !hlfir.expr> subroutine test2(x) use types interface elemental function elem(x) use types type(t), intent(in) :: x type(t) :: elem end function elem elemental function elem2(x, y) use types type(t), intent(in) :: x, y type(t) :: elem2 end function elem2 end interface type(t) :: x(:) x = elem2(elem(x), elem(x)) end subroutine test2 ! CHECK-LABEL: func.func @_QPtest2( ! CHECK: %[[VAL_8:.*]] = hlfir.elemental %{{.*}} : (!fir.shape<1>) -> !hlfir.expr> { ! CHECK-NOT: fir.call @_FortranADestroy ! CHECK: %[[VAL_16:.*]] = hlfir.elemental %{{.*}} : (!fir.shape<1>) -> !hlfir.expr> { ! CHECK-NOT: fir.call @_FortranADestroy ! CHECK: %[[VAL_23:.*]] = hlfir.elemental %{{.*}} : (!fir.shape<1>) -> !hlfir.expr> { ! CHECK-NOT: fir.call @_FortranADestroy ! CHECK: hlfir.destroy %[[VAL_23]] finalize : !hlfir.expr> ! CHECK: hlfir.destroy %[[VAL_16]] finalize : !hlfir.expr> ! CHECK: hlfir.destroy %[[VAL_8]] finalize : !hlfir.expr>