xref: /llvm-project/flang/test/Lower/c-interoperability-c-pointer.f90 (revision d9250061e10b82f82d9833009f6565775578ee58)
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