Files
TheRock/compiler/amd-llvm/flang/test/Lower/implicit-call-mismatch.f90
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

328 lines
16 KiB
Fortran

! Test questionable but existing abuses of implicit interfaces.
! Lowering must close the eyes and do as if it did not know
! about the function definition since semantic lets these
! programs through with a warning.
! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
! Test reference to non-char procedure conversion.
subroutine takes_proc(proc)
real(8), external :: proc
end subroutine
subroutine pass_int_to_proc(a)
integer(4) :: a
call takes_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_int_to_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_proc) : (!fir.boxproc<() -> ()>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((!fir.boxproc<() -> ()>) -> ()) -> ((!fir.ref<i32>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.ref<i32>) -> ()
subroutine pass_logical_to_proc(a)
logical(4) :: a
call takes_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_logical_to_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_proc) : (!fir.boxproc<() -> ()>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((!fir.boxproc<() -> ()>) -> ()) -> ((!fir.ref<!fir.logical<4>>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.ref<!fir.logical<4>>) -> ()
subroutine pass_real_to_proc(a)
real(8) :: a
call takes_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_real_to_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_proc) : (!fir.boxproc<() -> ()>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((!fir.boxproc<() -> ()>) -> ()) -> ((!fir.ref<f64>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.ref<f64>) -> ()
subroutine pass_complex_to_proc(a)
complex(4) :: a
call takes_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_complex_to_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_proc) : (!fir.boxproc<() -> ()>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((!fir.boxproc<() -> ()>) -> ()) -> ((!fir.ref<complex<f32>>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.ref<complex<f32>>) -> ()
subroutine pass_char_to_proc(a)
character(8) :: a
call takes_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_char_to_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_proc) : (!fir.boxproc<() -> ()>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((!fir.boxproc<() -> ()>) -> ()) -> ((!fir.boxchar<1>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.boxchar<1>) -> ()
subroutine pass_dt_to_proc(a)
type :: dt
integer(4) :: i, j
end type
type(dt) :: a
call takes_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_dt_to_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_proc) : (!fir.boxproc<() -> ()>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((!fir.boxproc<() -> ()>) -> ()) -> ((!fir.ref<!fir.type<{{.*}}>>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.ref<!fir.type<{{.*}}>>) -> ()
subroutine pass_array_to_proc(a)
integer(4) :: a(10,10)
call takes_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_array_to_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_proc) : (!fir.boxproc<() -> ()>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((!fir.boxproc<() -> ()>) -> ()) -> ((!fir.ref<!fir.array<10x10xi32>>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.ref<!fir.array<10x10xi32>>) -> ()
! Test procedure conversion.
subroutine pass_char_proc_to_proc(a)
character(8), external :: a
call takes_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_char_proc_to_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_proc) : (!fir.boxproc<() -> ()>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((!fir.boxproc<() -> ()>) -> ()) -> ((tuple<!fir.boxproc<() -> ()>, i64>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
subroutine pass_proc_to_proc(a)
external :: a
call takes_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_proc_to_proc(
! CHECK: fir.call @_QPtakes_proc({{.*}}) {{.*}}: (!fir.boxproc<() -> ()>) -> ()
! Test conversion from procedure to other data types.
! CHECK-LABEL: func.func @_QPtest_conversion_from_proc(
subroutine test_conversion_from_proc
external :: proc
! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : (() -> ()) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_int_to_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]]
! CHECK: fir.call %[[convert]](%[[boxproc]])
call pass_int_to_proc(proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : (() -> ()) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_logical_to_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]]
! CHECK: fir.call %[[convert]](%[[boxproc]])
call pass_logical_to_proc(proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : (() -> ()) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_real_to_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]]
! CHECK: fir.call %[[convert]](%[[boxproc]])
call pass_real_to_proc(proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : (() -> ()) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_complex_to_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]]
! CHECK: fir.call %[[convert]](%[[boxproc]])
call pass_complex_to_proc(proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : (() -> ()) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_char_to_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]]
! CHECK: fir.call %[[convert]](%[[boxproc]])
call pass_char_to_proc(proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : (() -> ()) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_dt_to_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]]
! CHECK: fir.call %[[convert]](%[[boxproc]])
call pass_dt_to_proc(proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : (() -> ()) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_array_to_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]]
! CHECK: fir.call %[[convert]](%[[boxproc]])
call pass_array_to_proc(proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[proc]] : (() -> ()) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_char_proc_to_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]]
! CHECK: fir.call %[[convert]](%[[boxProc]])
call pass_char_proc_to_proc(proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
! CHECK: %[[box:.*]] = fir.emboxproc %[[proc]] : (() -> ()) -> !fir.boxproc<() -> ()>
! CHECK: fir.call @_QPpass_proc_to_proc(%[[box]])
call pass_proc_to_proc(proc)
end subroutine
! Test reference to char procedure conversion.
subroutine takes_char_proc(cp)
character(8), external :: cp
end subroutine
subroutine pass_int_to_char_proc(a)
integer(4) :: a
call takes_char_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_int_to_char_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_char_proc) : (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((tuple<!fir.boxproc<() -> ()>, i64>) -> ()) -> ((!fir.ref<i32>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.ref<i32>) -> ()
subroutine pass_logical_to_char_proc(a)
logical(4) :: a
call takes_char_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_logical_to_char_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_char_proc) : (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((tuple<!fir.boxproc<() -> ()>, i64>) -> ()) -> ((!fir.ref<!fir.logical<4>>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.ref<!fir.logical<4>>) -> ()
subroutine pass_real_to_char_proc(a)
real(8) :: a
call takes_char_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_real_to_char_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_char_proc) : (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((tuple<!fir.boxproc<() -> ()>, i64>) -> ()) -> ((!fir.ref<f64>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.ref<f64>) -> ()
subroutine pass_complex_to_char_proc(a)
complex(4) :: a
call takes_char_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_complex_to_char_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_char_proc) : (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((tuple<!fir.boxproc<() -> ()>, i64>) -> ()) -> ((!fir.ref<complex<f32>>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.ref<complex<f32>>) -> ()
subroutine pass_char_to_char_proc(a)
character(8) :: a
call takes_char_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_char_to_char_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_char_proc) : (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((tuple<!fir.boxproc<() -> ()>, i64>) -> ()) -> ((!fir.boxchar<1>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.boxchar<1>) -> ()
subroutine pass_dt_to_char_proc(a)
type :: dt
integer(4) :: i, j
end type
type(dt) :: a
call takes_char_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_dt_to_char_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_char_proc) : (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((tuple<!fir.boxproc<() -> ()>, i64>) -> ()) -> ((!fir.ref<!fir.type<{{.*}}>>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.ref<!fir.type<{{.*}}>>) -> ()
subroutine pass_array_to_char_proc(a)
integer(4) :: a(10,10)
call takes_char_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_array_to_char_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_char_proc) : (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((tuple<!fir.boxproc<() -> ()>, i64>) -> ()) -> ((!fir.ref<!fir.array<10x10xi32>>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.ref<!fir.array<10x10xi32>>) -> ()
! Test procedure conversion.
subroutine pass_proc_to_char_proc(a)
external :: a
call takes_char_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_proc_to_char_proc(
! CHECK: %[[VAL_addr:.*]] = fir.address_of(@_QPtakes_char_proc) : (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
! CHECK: %[[VAL_conv:.*]] = fir.convert %[[VAL_addr]] : ((tuple<!fir.boxproc<() -> ()>, i64>) -> ()) -> ((!fir.boxproc<() -> ()>) -> ())
! CHECK: fir.call %[[VAL_conv]]({{.*}}) {{.*}}: (!fir.boxproc<() -> ()>) -> ()
subroutine pass_char_proc_to_char_proc(a)
character(8), external :: a
call takes_char_proc(a)
end subroutine
! CHECK-LABEL: func.func @_QPpass_char_proc_to_char_proc(
! CHECK: fir.call @_QPtakes_char_proc({{.*}}) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
! Test conversion from character procedure to other data types.
! CHECK-LABEL: func.func @_QPtest_conversion_from_char_proc(
subroutine test_conversion_from_char_proc
character(8), external :: char_proc
! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : {{.*}} -> !fir.boxchar<1>
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : ({{.*}} -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_int_to_char_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]] : ((!fir.ref<i32>) -> ()) -> ((tuple<!fir.boxproc<() -> ()>, i64>) -> ())
! CHECK: fir.call %[[convert]]({{.*}})
call pass_int_to_char_proc(char_proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : {{.*}} -> !fir.boxchar<1>
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : ({{.*}} -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_logical_to_char_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]] : ((!fir.ref<!fir.logical<4>>) -> ()) -> ((tuple<!fir.boxproc<() -> ()>, i64>) -> ())
! CHECK: fir.call %[[convert]]({{.*}})
call pass_logical_to_char_proc(char_proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : {{.*}} -> !fir.boxchar<1>
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : ({{.*}} -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_real_to_char_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]] : ((!fir.ref<f64>) -> ()) -> ((tuple<!fir.boxproc<() -> ()>, i64>) -> ())
! CHECK: fir.call %[[convert]]({{.*}})
call pass_real_to_char_proc(char_proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : {{.*}} -> !fir.boxchar<1>
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : ({{.*}} -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_complex_to_char_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]] : ((!fir.ref<complex<f32>>) -> ()) -> ((tuple<!fir.boxproc<() -> ()>, i64>) -> ())
! CHECK: fir.call %[[convert]]({{.*}})
call pass_complex_to_char_proc(char_proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : {{.*}} -> !fir.boxchar<1>
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : ({{.*}} -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_char_to_char_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]] : ((!fir.boxchar<1>) -> ()) -> ((tuple<!fir.boxproc<() -> ()>, i64>) -> ())
! CHECK: fir.call %[[convert]]({{.*}})
call pass_char_to_char_proc(char_proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : {{.*}} -> !fir.boxchar<1>
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : ({{.*}} -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_dt_to_char_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]] : ((!fir.ref<!fir.type<{{.*}}>>) -> ()) -> ((tuple<!fir.boxproc<() -> ()>, i64>) -> ())
! CHECK: fir.call %[[convert]]({{.*}})
call pass_dt_to_char_proc(char_proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : {{.*}} -> !fir.boxchar<1>
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : ({{.*}} -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_array_to_char_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]] : ((!fir.ref<!fir.array<10x10xi32>>) -> ()) -> ((tuple<!fir.boxproc<() -> ()>, i64>) -> ())
! CHECK: fir.call %[[convert]]({{.*}})
call pass_array_to_char_proc(char_proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : {{.*}} -> !fir.boxchar<1>
! CHECK: %[[boxproc:.*]] = fir.emboxproc %[[proc]] : ({{.*}} -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>
! CHECK: %[[callee:.*]] = fir.address_of(@_QPpass_proc_to_char_proc)
! CHECK: %[[convert:.*]] = fir.convert %[[callee]] : ((!fir.boxproc<() -> ()>) -> ()) -> ((tuple<!fir.boxproc<() -> ()>, i64>) -> ())
! CHECK: fir.call %[[convert]]({{.*}})
call pass_proc_to_char_proc(char_proc)
! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : {{.*}} -> !fir.boxchar<1>
! CHECK: %[[len:.*]] = arith.constant 8 : i64
! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[proc]] : ({{.*}} -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>
! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>
! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>
! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[len]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>
! CHECK: fir.call @_QPpass_char_proc_to_char_proc(%[[tuple3]])
call pass_char_proc_to_char_proc(char_proc)
end subroutine