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