1! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s 2 3! CHECK-LABEL: func.func @_QPtest( 4! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>> {fir.bindc_name = "ptr1"}, 5! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>> {fir.bindc_name = "ptr2"}) { 6! CHECK: %[[VAL_2:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> 7! 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> 8! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]] : !fir.ref<i64> 9! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i64) -> !fir.ref<i64> 10! CHECK: %[[VAL_6:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}> 11! 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> 12! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_7]] : !fir.ref<i64> 13! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> !fir.ref<i64> 14! CHECK: fir.call @c_func(%[[VAL_5]], %[[VAL_9]]) {{.*}}: (!fir.ref<i64>, !fir.ref<i64>) -> () 15! CHECK: return 16! CHECK: } 17 18subroutine test(ptr1, ptr2) 19 use, intrinsic :: iso_c_binding 20 type(c_ptr) :: ptr1 21 type(c_funptr) :: ptr2 22 23 interface 24 subroutine c_func(c_t1, c_t2) bind(c, name="c_func") 25 import :: c_ptr, c_funptr 26 type(c_ptr), value :: c_t1 27 type(c_funptr), value :: c_t2 28 end 29 end interface 30 31 call c_func(ptr1, ptr2) 32end 33 34! CHECK-LABEL: func.func @test_callee_c_ptr( 35! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i64> 36! CHECK: %[[VAL_5:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> {bindc_name = "local", uniq_name = "_QFtest_callee_c_ptrElocal"} 37! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> 38! CHECK: %[[VAL_2:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> 39! 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> 40! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<i64>) -> i64 41! CHECK: fir.store %[[VAL_4]] to %[[VAL_3]] : !fir.ref<i64> 42! CHECK: %[[VAL_6:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> 43! 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> 44! CHECK: %[[VAL_8:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> 45! 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> 46! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_7]] : !fir.ref<i64> 47! CHECK: fir.store %[[VAL_10]] to %[[VAL_9]] : !fir.ref<i64> 48! CHECK: return 49! CHECK: } 50 51subroutine test_callee_c_ptr(ptr1) bind(c) 52 use, intrinsic :: iso_c_binding 53 type(c_ptr), value :: ptr1 54 type(c_ptr) :: local 55 local = ptr1 56end subroutine 57 58! CHECK-LABEL: func.func @test_callee_c_funptr( 59! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i64> 60! CHECK: %[[VAL_5:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}> {bindc_name = "local", uniq_name = "_QFtest_callee_c_funptrElocal"} 61! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}> 62! CHECK: %[[VAL_2:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}> 63! 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> 64! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<i64>) -> i64 65! CHECK: fir.store %[[VAL_4]] to %[[VAL_3]] : !fir.ref<i64> 66 67! CHECK: %[[VAL_6:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}> 68! 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> 69! CHECK: %[[VAL_8:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}> 70! 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> 71! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_7]] : !fir.ref<i64> 72! CHECK: fir.store %[[VAL_10]] to %[[VAL_9]] : !fir.ref<i64> 73! CHECK: return 74! CHECK: } 75 76subroutine test_callee_c_funptr(ptr1) bind(c) 77 use, intrinsic :: iso_c_binding 78 type(c_funptr), value :: ptr1 79 type(c_funptr) :: local 80 local = ptr1 81end subroutine 82