1f35f863aSjeanPerier! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s 24943dbdfSPeixin Qiao 34943dbdfSPeixin Qiao! CHECK-LABEL: func.func @_QPtest( 44943dbdfSPeixin Qiao! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>> {fir.bindc_name = "ptr1"}, 54943dbdfSPeixin Qiao! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>> {fir.bindc_name = "ptr2"}) { 64943dbdfSPeixin Qiao! CHECK: %[[VAL_2:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> 74943dbdfSPeixin Qiao! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_0]], %[[VAL_2]] : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.field) -> !fir.ref<i64> 84943dbdfSPeixin Qiao! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]] : !fir.ref<i64> 94943dbdfSPeixin Qiao! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i64) -> !fir.ref<i64> 104943dbdfSPeixin Qiao! CHECK: %[[VAL_6:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}> 114943dbdfSPeixin Qiao! CHECK: %[[VAL_7:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_6]] : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>, !fir.field) -> !fir.ref<i64> 124943dbdfSPeixin Qiao! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_7]] : !fir.ref<i64> 134943dbdfSPeixin Qiao! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> !fir.ref<i64> 144cc9437aSTom Eccles! CHECK: fir.call @c_func(%[[VAL_5]], %[[VAL_9]]) {{.*}}: (!fir.ref<i64>, !fir.ref<i64>) -> () 154943dbdfSPeixin Qiao! CHECK: return 164943dbdfSPeixin Qiao! CHECK: } 174943dbdfSPeixin Qiao 184943dbdfSPeixin Qiaosubroutine test(ptr1, ptr2) 194943dbdfSPeixin Qiao use, intrinsic :: iso_c_binding 204943dbdfSPeixin Qiao type(c_ptr) :: ptr1 214943dbdfSPeixin Qiao type(c_funptr) :: ptr2 224943dbdfSPeixin Qiao 234943dbdfSPeixin Qiao interface 244943dbdfSPeixin Qiao subroutine c_func(c_t1, c_t2) bind(c, name="c_func") 254943dbdfSPeixin Qiao import :: c_ptr, c_funptr 264943dbdfSPeixin Qiao type(c_ptr), value :: c_t1 274943dbdfSPeixin Qiao type(c_funptr), value :: c_t2 284943dbdfSPeixin Qiao end 294943dbdfSPeixin Qiao end interface 304943dbdfSPeixin Qiao 314943dbdfSPeixin Qiao call c_func(ptr1, ptr2) 324943dbdfSPeixin Qiaoend 334943dbdfSPeixin Qiao 344943dbdfSPeixin Qiao! CHECK-LABEL: func.func @test_callee_c_ptr( 35*d9250061SjeanPerier! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i64> 36ab9c4e9fSJean Perier! CHECK: %[[VAL_5:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> {bindc_name = "local", uniq_name = "_QFtest_callee_c_ptrElocal"} 374943dbdfSPeixin Qiao! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> 384943dbdfSPeixin Qiao! CHECK: %[[VAL_2:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> 394943dbdfSPeixin Qiao! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_2]] : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.field) -> !fir.ref<i64> 404943dbdfSPeixin Qiao! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<i64>) -> i64 414943dbdfSPeixin Qiao! CHECK: fir.store %[[VAL_4]] to %[[VAL_3]] : !fir.ref<i64> 424943dbdfSPeixin Qiao! CHECK: %[[VAL_6:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> 434943dbdfSPeixin Qiao! CHECK: %[[VAL_7:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_6]] : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.field) -> !fir.ref<i64> 444943dbdfSPeixin Qiao! CHECK: %[[VAL_8:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> 454943dbdfSPeixin Qiao! CHECK: %[[VAL_9:.*]] = fir.coordinate_of %[[VAL_5]], %[[VAL_8]] : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.field) -> !fir.ref<i64> 464943dbdfSPeixin Qiao! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_7]] : !fir.ref<i64> 474943dbdfSPeixin Qiao! CHECK: fir.store %[[VAL_10]] to %[[VAL_9]] : !fir.ref<i64> 484943dbdfSPeixin Qiao! CHECK: return 494943dbdfSPeixin Qiao! CHECK: } 504943dbdfSPeixin Qiao 514943dbdfSPeixin Qiaosubroutine test_callee_c_ptr(ptr1) bind(c) 524943dbdfSPeixin Qiao use, intrinsic :: iso_c_binding 534943dbdfSPeixin Qiao type(c_ptr), value :: ptr1 544943dbdfSPeixin Qiao type(c_ptr) :: local 554943dbdfSPeixin Qiao local = ptr1 564943dbdfSPeixin Qiaoend subroutine 574943dbdfSPeixin Qiao 584943dbdfSPeixin Qiao! CHECK-LABEL: func.func @test_callee_c_funptr( 59*d9250061SjeanPerier! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i64> 60ab9c4e9fSJean Perier! CHECK: %[[VAL_5:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}> {bindc_name = "local", uniq_name = "_QFtest_callee_c_funptrElocal"} 614943dbdfSPeixin Qiao! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}> 624943dbdfSPeixin Qiao! CHECK: %[[VAL_2:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}> 634943dbdfSPeixin Qiao! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_2]] : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>, !fir.field) -> !fir.ref<i64> 644943dbdfSPeixin Qiao! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<i64>) -> i64 654943dbdfSPeixin Qiao! CHECK: fir.store %[[VAL_4]] to %[[VAL_3]] : !fir.ref<i64> 66ab9c4e9fSJean Perier 674943dbdfSPeixin Qiao! CHECK: %[[VAL_6:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}> 684943dbdfSPeixin Qiao! CHECK: %[[VAL_7:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_6]] : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>, !fir.field) -> !fir.ref<i64> 694943dbdfSPeixin Qiao! CHECK: %[[VAL_8:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}> 704943dbdfSPeixin Qiao! CHECK: %[[VAL_9:.*]] = fir.coordinate_of %[[VAL_5]], %[[VAL_8]] : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>, !fir.field) -> !fir.ref<i64> 714943dbdfSPeixin Qiao! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_7]] : !fir.ref<i64> 724943dbdfSPeixin Qiao! CHECK: fir.store %[[VAL_10]] to %[[VAL_9]] : !fir.ref<i64> 734943dbdfSPeixin Qiao! CHECK: return 744943dbdfSPeixin Qiao! CHECK: } 754943dbdfSPeixin Qiao 764943dbdfSPeixin Qiaosubroutine test_callee_c_funptr(ptr1) bind(c) 774943dbdfSPeixin Qiao use, intrinsic :: iso_c_binding 784943dbdfSPeixin Qiao type(c_funptr), value :: ptr1 794943dbdfSPeixin Qiao type(c_funptr) :: local 804943dbdfSPeixin Qiao local = ptr1 814943dbdfSPeixin Qiaoend subroutine 82