brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.8 KiB · e6bc75c Raw
366 lines · plain
1! Test questionable but existing abuses of implicit interfaces.2! Lowering must close the eyes and do as if it did not know3! about the function definition since semantic lets these4! programs through with a warning.5! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s6 7! Test reference to non-char procedure conversion.8 9subroutine takes_proc(proc)10  real(8), external :: proc11end subroutine12 13subroutine pass_int_to_proc(a)14  integer(4) :: a15  call takes_proc(a)16end subroutine17! CHECK-LABEL: func.func @_QPpass_int_to_proc(18! CHECK-SAME: %[[arg0:.*]]: !fir.ref<i32>19! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<i32>) -> (() -> ())20! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>21! CHECK: fir.call @_QPtakes_proc(%[[boxProc]]) {{.*}}: (!fir.boxproc<() -> ()>) -> ()22 23subroutine pass_logical_to_proc(a)24  logical(4) :: a25  call takes_proc(a)26end subroutine27! CHECK-LABEL: func.func @_QPpass_logical_to_proc(28! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.logical<4>>29! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<!fir.logical<4>>) -> (() -> ())30! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>31! CHECK: fir.call @_QPtakes_proc(%[[boxProc]]) {{.*}}: (!fir.boxproc<() -> ()>) -> ()32 33subroutine pass_real_to_proc(a)34  real(8) :: a35  call takes_proc(a)36end subroutine37! CHECK-LABEL: func.func @_QPpass_real_to_proc(38! CHECK-SAME: %[[arg0:.*]]: !fir.ref<f64>39! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<f64>) -> (() -> ())40! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>41! CHECK: fir.call @_QPtakes_proc(%[[boxProc]]) {{.*}}: (!fir.boxproc<() -> ()>) -> ()42 43subroutine pass_complex_to_proc(a)44  complex(4) :: a45  call takes_proc(a)46end subroutine47! CHECK-LABEL: func.func @_QPpass_complex_to_proc(48! CHECK-SAME: %[[arg0:.*]]: !fir.ref<complex<f32>>49! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<complex<f32>>) -> (() -> ())50! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>51! CHECK: fir.call @_QPtakes_proc(%[[boxProc]]) {{.*}}: (!fir.boxproc<() -> ()>) -> ()52 53subroutine pass_char_to_proc(a)54  character(8) :: a55  call takes_proc(a)56end subroutine57! CHECK-LABEL: func.func @_QPpass_char_to_proc(58! CHECK-SAME: %[[arg0:.*]]: !fir.boxchar<1>59! CHECK: %[[charAndLen:.*]]:2 = fir.unboxchar %[[arg0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)60! CHECK: %[[charRef:.*]] = fir.convert %[[charAndLen]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1,8>>61! CHECK: %[[procAddr:.*]] = fir.convert %[[charRef]] : (!fir.ref<!fir.char<1,8>>) -> (() -> ())62! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>63! CHECK: fir.call @_QPtakes_proc(%[[boxProc]]) {{.*}}: (!fir.boxproc<() -> ()>) -> ()64 65subroutine pass_dt_to_proc(a)66  type :: dt67    integer(4) :: i, j68  end type69  type(dt) :: a70 71  call takes_proc(a)72end subroutine73! CHECK-LABEL: func.func @_QPpass_dt_to_proc(74! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.type<_QFpass_dt_to_procTdt{i:i32,j:i32}>>75! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<!fir.type<_QFpass_dt_to_procTdt{i:i32,j:i32}>>) -> (() -> ())76! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>77! CHECK: fir.call @_QPtakes_proc(%[[boxProc]]) {{.*}}: (!fir.boxproc<() -> ()>) -> ()78 79subroutine pass_array_to_proc(a)80  integer(4) :: a(10,10)81  call takes_proc(a)82end subroutine83! CHECK-LABEL: func.func @_QPpass_array_to_proc(84! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<10x10xi32>>85! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<!fir.array<10x10xi32>>) -> (() -> ())86! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>87! CHECK: fir.call @_QPtakes_proc(%[[boxProc]]) {{.*}}: (!fir.boxproc<() -> ()>) -> ()88 89! Test procedure conversion.90 91subroutine pass_char_proc_to_proc(a)92  character(8), external :: a93  call takes_proc(a)94end subroutine95! CHECK-LABEL: func.func @_QPpass_char_proc_to_proc(96! CHECK-SAME: %[[arg0:.*]]: tuple<!fir.boxproc<() -> ()>, i64>97! CHECK: %[[extract:.*]] = fir.extract_value %[[arg0]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>) -> !fir.boxproc<() -> ()>98! CHECK: %[[procAddr:.*]] = fir.box_addr %[[extract]] : (!fir.boxproc<() -> ()>) -> (() -> ())99! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>100! CHECK: fir.call @_QPtakes_proc(%[[boxProc]]) {{.*}}: (!fir.boxproc<() -> ()>) -> ()101 102subroutine pass_proc_to_proc(a)103  external :: a104  call takes_proc(a)105end subroutine106! CHECK-LABEL: func.func @_QPpass_proc_to_proc(107! CHECK-SAME: %[[arg0:.*]]: !fir.boxproc<() -> ()>108! CHECK: fir.call @_QPtakes_proc(%[[arg0]]) {{.*}}: (!fir.boxproc<() -> ()>) -> ()109 110! Test conversion from procedure to other data types.111 112! CHECK-LABEL: func.func @_QPtest_conversion_from_proc(113subroutine test_conversion_from_proc114  external :: proc115 116  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()117  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : (() -> ()) -> !fir.ref<i32>118  ! CHECK: fir.call @_QPpass_int_to_proc(%[[convert]])119  call pass_int_to_proc(proc)120 121  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()122  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : (() -> ()) -> !fir.ref<!fir.logical<4>>123  ! CHECK: fir.call @_QPpass_logical_to_proc(%[[convert]])124  call pass_logical_to_proc(proc)125 126  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()127  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : (() -> ()) -> !fir.ref<f64>128  ! CHECK: fir.call @_QPpass_real_to_proc(%[[convert]])129  call pass_real_to_proc(proc)130 131  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()132  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : (() -> ()) -> !fir.ref<complex<f32>>133  ! CHECK: fir.call @_QPpass_complex_to_proc(%[[convert]])134  call pass_complex_to_proc(proc)135 136  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()137  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : (() -> ()) -> !fir.ref<!fir.char<1,?>>138  ! CHECK: %[[box:.*]] = fir.emboxchar %[[convert]], %c0{{.*}} : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>139  ! CHECK: fir.call @_QPpass_char_to_proc(%[[box]])140  call pass_char_to_proc(proc)141 142  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()143  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : (() -> ()) -> !fir.ref<!fir.type<_QFpass_dt_to_procTdt{i:i32,j:i32}>>144  ! CHECK: fir.call @_QPpass_dt_to_proc(%[[convert]])145  call pass_dt_to_proc(proc)146 147  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()148  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : (() -> ()) -> !fir.ref<!fir.array<10x10xi32>>149  ! CHECK: fir.call @_QPpass_array_to_proc(%[[convert]])150  call pass_array_to_proc(proc)151 152  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()153  ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[proc]] : (() -> ()) -> !fir.boxproc<() -> ()>154  ! CHECK: %[[len:.*]] = fir.undefined i64155  ! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>156  ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>157  ! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[len]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>158  ! CHECK: fir.call @_QPpass_char_proc_to_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()159  call pass_char_proc_to_proc(proc)160 161  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()162  ! CHECK: %[[box:.*]] = fir.emboxproc %[[proc]] : (() -> ()) -> !fir.boxproc<() -> ()>163  ! CHECK: fir.call @_QPpass_proc_to_proc(%[[box]])164  call pass_proc_to_proc(proc)165end subroutine166 167! Test reference to char procedure conversion.168 169subroutine takes_char_proc(cp)170  character(8), external :: cp171end subroutine172 173subroutine pass_int_to_char_proc(a)174  integer(4) :: a175  call takes_char_proc(a)176end subroutine177! CHECK-LABEL: func.func @_QPpass_int_to_char_proc(178! CHECK-SAME: %[[arg0:.*]]: !fir.ref<i32>179! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<i32>) -> (() -> ())180! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>181! CHECK: %[[charLen:.*]] = fir.undefined i64182! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>183! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>184! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>185! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()186 187subroutine pass_logical_to_char_proc(a)188  logical(4) :: a189  call takes_char_proc(a)190end subroutine191! CHECK-LABEL: func.func @_QPpass_logical_to_char_proc(192! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.logical<4>>193! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<!fir.logical<4>>) -> (() -> ())194! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>195! CHECK: %[[charLen:.*]] = fir.undefined i64196! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>197! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>198! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>199! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()200 201subroutine pass_real_to_char_proc(a)202  real(8) :: a203  call takes_char_proc(a)204end subroutine205! CHECK-LABEL: func.func @_QPpass_real_to_char_proc(206! CHECK-SAME: %[[arg0:.*]]: !fir.ref<f64>207! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<f64>) -> (() -> ())208! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>209! CHECK: %[[charLen:.*]] = fir.undefined i64210! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>211! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>212! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>213! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()214 215subroutine pass_complex_to_char_proc(a)216  complex(4) :: a217  call takes_char_proc(a)218end subroutine219! CHECK-LABEL: func.func @_QPpass_complex_to_char_proc(220! CHECK-SAME: %[[arg0:.*]]: !fir.ref<complex<f32>>221! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<complex<f32>>) -> (() -> ())222! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>223! CHECK: %[[charLen:.*]] = fir.undefined i64224! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>225! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>226! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>227! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()228 229subroutine pass_char_to_char_proc(a)230  character(8) :: a231  call takes_char_proc(a)232end subroutine233! CHECK-LABEL: func.func @_QPpass_char_to_char_proc(234! CHECK-SAME: %[[arg0:.*]]: !fir.boxchar<1>235! CHECK: %[[charRefAndLen:.*]]:2 = fir.unboxchar %[[arg0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)236! CHECK: %[[charRef:.*]] = fir.convert %[[charRefAndLen]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1,8>>237! CHECK: %[[charLen:.*]] = arith.constant 8 : index238! CHECK: %[[procAddr:.*]] = fir.convert %[[charRef]] : (!fir.ref<!fir.char<1,8>>) -> (() -> ())239! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>240! CHECK: %[[charLen2:.*]] = fir.convert %[[charLen]] : (index) -> i64241! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>242! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>243! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen2]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>244! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()245 246subroutine pass_dt_to_char_proc(a)247  type :: dt248    integer(4) :: i, j249  end type250  type(dt) :: a251 252  call takes_char_proc(a)253end subroutine254! CHECK-LABEL: func.func @_QPpass_dt_to_char_proc(255! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.type<_QFpass_dt_to_char_procTdt{i:i32,j:i32}>>256! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<!fir.type<_QFpass_dt_to_char_procTdt{i:i32,j:i32}>>) -> (() -> ())257! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>258! CHECK: %[[charLen:.*]] = fir.undefined i64259! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>260! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>261! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>262! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()263 264subroutine pass_array_to_char_proc(a)265  integer(4) :: a(10,10)266  call takes_char_proc(a)267end subroutine268! CHECK-LABEL: func.func @_QPpass_array_to_char_proc(269! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<10x10xi32>>270! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<!fir.array<10x10xi32>>) -> (() -> ())271! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>272! CHECK: %[[charLen:.*]] = fir.undefined i64273! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>274! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>275! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>276! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()277 278! Test procedure conversion.279 280subroutine pass_proc_to_char_proc(a)281  external :: a282  call takes_char_proc(a)283end subroutine284! CHECK-LABEL: func.func @_QPpass_proc_to_char_proc(285! CHECK-SAME: %[[arg0:.*]]: !fir.boxproc<() -> ()>286! CHECK: %[[procAddr:.*]] = fir.box_addr %[[arg0]] : (!fir.boxproc<() -> ()>) -> (() -> ())287! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>288! CHECK: %[[charLen:.*]] = fir.undefined i64289! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>290! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>291! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>292! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()293 294subroutine pass_char_proc_to_char_proc(a)295  character(8), external :: a296  call takes_char_proc(a)297end subroutine298! CHECK-LABEL: func.func @_QPpass_char_proc_to_char_proc(299! CHECK-SAME: %[[arg0:.*]]: tuple<!fir.boxproc<() -> ()>, i64>300! CHECK: %[[boxProc:.*]] = fir.extract_value %arg0, [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>) -> !fir.boxproc<() -> ()>301! CHECK: %[[procAddr:.*]] = fir.box_addr %[[boxProc]] : (!fir.boxproc<() -> ()>) -> (() -> ())302! CHECK: %[[charLen:.*]] = arith.constant 8 : i64303! CHECK: %[[boxProc2:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>304! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>305! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc2]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>306! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>307! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()308 309! Test conversion from character procedure to other data types.310 311! CHECK-LABEL: func.func @_QPtest_conversion_from_char_proc(312subroutine test_conversion_from_char_proc313  character(8), external :: char_proc314 315  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>316  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.ref<i32>317  ! CHECK: fir.call @_QPpass_int_to_char_proc(%[[convert]])318  call pass_int_to_char_proc(char_proc)319 320  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>321  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.ref<!fir.logical<4>>322  ! CHECK: fir.call @_QPpass_logical_to_char_proc(%[[convert]])323  call pass_logical_to_char_proc(char_proc)324 325  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>326  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.ref<f64>327  ! CHECK: fir.call @_QPpass_real_to_char_proc(%[[convert]])328  call pass_real_to_char_proc(char_proc)329 330  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>331  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.ref<complex<f32>>332  ! CHECK: fir.call @_QPpass_complex_to_char_proc(%[[convert]])333  call pass_complex_to_char_proc(char_proc)334 335  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>336  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.ref<!fir.char<1,?>>337  ! CHECK: %[[len:.*]] = fir.undefined index338  ! CHECK: %[[box:.*]] = fir.emboxchar %[[convert]], %[[len]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>339  ! CHECK: fir.call @_QPpass_char_to_char_proc(%[[box]])340  call pass_char_to_char_proc(char_proc)341 342  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>343  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.ref<!fir.type<_QFpass_dt_to_char_procTdt{i:i32,j:i32}>>344  ! CHECK: fir.call @_QPpass_dt_to_char_proc(%[[convert]])345  call pass_dt_to_char_proc(char_proc)346 347  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>348  ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.ref<!fir.array<10x10xi32>>349  ! CHECK: fir.call @_QPpass_array_to_char_proc(%[[convert]])350  call pass_array_to_char_proc(char_proc)351 352  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>353  ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>354  ! CHECK: fir.call @_QPpass_proc_to_char_proc(%[[boxProc]])355  call pass_proc_to_char_proc(char_proc)356 357  ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>358  ! CHECK: %[[len:.*]] = arith.constant 8 : i64359  ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>360  ! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>361  ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>362  ! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[len]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>363  ! CHECK: fir.call @_QPpass_char_proc_to_char_proc(%[[tuple3]])364  call pass_char_proc_to_char_proc(char_proc)365end subroutine366