! RUN: bbc -emit-hlfir %s -o - -I nowhere | FileCheck %s module types type t1 real :: x end type t1 type t2 real, allocatable :: x end type t2 type t3 real, pointer :: p end type t3 type t4 type(t1) :: c end type t4 type t5 type(t2) :: c end type t5 type t6 contains final :: finalize_t6 end type t6 type, extends(t1) :: t7 end type t7 type, extends(t2) :: t8 end type t8 type, extends(t6) :: t9 end type t9 contains subroutine finalize_t6(x) type(t6), intent(inout) :: x end subroutine finalize_t6 end module types subroutine test1 use types interface function ret_type_t1 use types type(t1) :: ret_type_t1 end function ret_type_t1 end interface type(t1) :: x x = ret_type_t1() end subroutine test1 ! CHECK-LABEL: func.func @_QPtest1() { ! CHECK-NOT: fir.call{{.*}}Destroy subroutine test1a use types interface function ret_type_t1a use types type(t1), allocatable :: ret_type_t1a end function ret_type_t1a end interface type(t1), allocatable :: x x = ret_type_t1a() end subroutine test1a ! CHECK-LABEL: func.func @_QPtest1a() { ! CHECK-NOT: fir.call{{.*}}Destroy ! CHECK: fir.if %{{.*}} { ! CHECK-NEXT: fir.freemem %{{.*}} : !fir.heap> ! CHECK-NOT: fir.call{{.*}}Destroy ! CHECK: fir.if %{{.*}} { ! CHECK: fir.call @_FortranAAllocatableDeallocate({{.*}}) fastmath : (!fir.ref>, i1, !fir.box, !fir.ref, i32) -> i32 ! CHECK-NOT: fir.call{{.*}}Destroy subroutine test1c use types interface function ret_class_t1 use types class(t1), allocatable :: ret_class_t1 end function ret_class_t1 end interface type(t1) :: x x = ret_class_t1() end subroutine test1c ! CHECK-LABEL: func.func @_QPtest1c() { ! CHECK: fir.call @_FortranADestroy ! CHECK: fir.if %{{.*}} { ! CHECK-NEXT: fir.freemem %{{.*}} : !fir.heap> subroutine test2 use types interface function ret_type_t2 use types type(t2) :: ret_type_t2 end function ret_type_t2 end interface type(t2) :: x x = ret_type_t2() end subroutine test2 ! CHECK-LABEL: func.func @_QPtest2() { ! CHECK: fir.call @_FortranADestroy subroutine test3 use types interface function ret_type_t3 use types type(t3) :: ret_type_t3 end function ret_type_t3 end interface type(t3) :: x x = ret_type_t3() end subroutine test3 ! CHECK-LABEL: func.func @_QPtest3() { ! CHECK-NOT: fir.call{{.*}}Destroy subroutine test4 use types interface function ret_type_t4 use types type(t4) :: ret_type_t4 end function ret_type_t4 end interface type(t4) :: x x = ret_type_t4() end subroutine test4 ! CHECK-LABEL: func.func @_QPtest4() { ! CHECK-NOT: fir.call{{.*}}Destroy subroutine test5 use types interface function ret_type_t5 use types type(t5) :: ret_type_t5 end function ret_type_t5 end interface type(t5) :: x x = ret_type_t5() end subroutine test5 ! CHECK-LABEL: func.func @_QPtest5() { ! CHECK: fir.call @_FortranADestroy subroutine test6 use types interface function ret_type_t6 use types type(t6) :: ret_type_t6 end function ret_type_t6 end interface type(t6) :: x x = ret_type_t6() end subroutine test6 ! CHECK-LABEL: func.func @_QPtest6() { ! CHECK: fir.call @_FortranADestroy ! CHECK: fir.call @_FortranADestroy subroutine test7 use types interface function ret_type_t7 use types type(t7) :: ret_type_t7 end function ret_type_t7 end interface type(t7) :: x x = ret_type_t7() end subroutine test7 ! CHECK-LABEL: func.func @_QPtest7() { ! CHECK-NOT: fir.call{{.*}}Destroy subroutine test8 use types interface function ret_type_t8 use types type(t8) :: ret_type_t8 end function ret_type_t8 end interface type(t8) :: x x = ret_type_t8() end subroutine test8 ! CHECK-LABEL: func.func @_QPtest8() { ! CHECK: fir.call @_FortranADestroy subroutine test9 use types interface function ret_type_t9 use types type(t9) :: ret_type_t9 end function ret_type_t9 end interface type(t9) :: x x = ret_type_t9() end subroutine test9 ! CHECK-LABEL: func.func @_QPtest9() { ! CHECK: fir.call @_FortranADestroy ! CHECK: fir.call @_FortranADestroy