54 lines · plain
1! RUN: bbc -emit-hlfir %s -o - | FileCheck %s2 3module poly4 type p15 integer :: a6 integer :: b7 contains8 procedure, nopass :: proc1 => proc1_p19 end type10 11 type, extends(p1) :: p212 integer :: c13 contains14 procedure, nopass :: proc1 => proc1_p215 end type16 17contains18 19 subroutine proc1_p1()20 print*, 'call proc1_p1'21 end subroutine22 23 subroutine proc1_p2()24 print*, 'call proc1_p2'25 end subroutine26 27 subroutine test_nullify()28 class(p1), pointer :: c29 30 allocate(p2::c)31 call c%proc1()32 33 nullify(c) ! c dynamic type must be reset to p134 35 call c%proc1()36 end subroutine37end module38 39program test40 use poly41 call test_nullify()42end43 44! CHECK-LABEL: func.func @_QMpolyPtest_nullify()45! CHECK: %[[C_DESC:.*]] = fir.alloca !fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>> {bindc_name = "c", uniq_name = "_QMpolyFtest_nullifyEc"}46! CHECK: %[[C_DESC_DECL:.*]]:2 = hlfir.declare %[[C_DESC]] {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QMpolyFtest_nullifyEc"} : (!fir.ref<!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>) -> (!fir.ref<!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>, !fir.ref<!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>)47! CHECK: %{{.*}} = fir.call @_FortranAPointerAllocate(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i3248! CHECK: %[[DECLARED_TYPE_DESC:.*]] = fir.type_desc !fir.type<_QMpolyTp1{a:i32,b:i32}>49! CHECK: %[[C_DESC_CAST:.*]] = fir.convert %[[C_DESC_DECL]]#0 : (!fir.ref<!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>) -> !fir.ref<!fir.box<none>>50! CHECK: %[[TYPE_DESC_CAST:.*]] = fir.convert %[[DECLARED_TYPE_DESC]] : (!fir.tdesc<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) -> !fir.ref<none>51! CHECK: %[[RANK:.*]] = arith.constant 0 : i3252! CHECK: %[[CORANK:.*]] = arith.constant 0 : i3253! CHECK: fir.call @_FortranAPointerNullifyDerived(%[[C_DESC_CAST]], %[[TYPE_DESC_CAST]], %[[RANK]], %[[CORANK]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.ref<none>, i32, i32) -> ()54