[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / flang / test / Lower / implicit-call-mismatch.f90
blob5d38bd6cc06268b4fcd1ada872344df0e8e6261b
1 ! Test questionable but existing abuses of implicit interfaces.
2 ! Lowering must close the eyes and do as if it did not know
3 ! about the function definition since semantic lets these
4 ! programs through with a warning.
5 ! RUN: bbc -emit-fir %s -o - | FileCheck %s
7 ! Test reference to non-char procedure conversion.
9 subroutine takes_proc(proc)
10 real(8), external :: proc
11 end subroutine
13 subroutine pass_int_to_proc(a)
14 integer(4) :: a
15 call takes_proc(a)
16 end subroutine
17 ! 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<() -> ()>) -> ()
23 subroutine pass_logical_to_proc(a)
24 logical(4) :: a
25 call takes_proc(a)
26 end subroutine
27 ! 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<() -> ()>) -> ()
33 subroutine pass_real_to_proc(a)
34 real(8) :: a
35 call takes_proc(a)
36 end subroutine
37 ! 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<() -> ()>) -> ()
43 subroutine pass_complex_to_proc(a)
44 complex(4) :: a
45 call takes_proc(a)
46 end subroutine
47 ! CHECK-LABEL: func.func @_QPpass_complex_to_proc(
48 ! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.complex<4>>
49 ! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<!fir.complex<4>>) -> (() -> ())
50 ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>
51 ! CHECK: fir.call @_QPtakes_proc(%[[boxProc]]) {{.*}}: (!fir.boxproc<() -> ()>) -> ()
53 subroutine pass_char_to_proc(a)
54 character(8) :: a
55 call takes_proc(a)
56 end subroutine
57 ! 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<() -> ()>) -> ()
65 subroutine pass_dt_to_proc(a)
66 type :: dt
67 integer(4) :: i, j
68 end type
69 type(dt) :: a
71 call takes_proc(a)
72 end subroutine
73 ! 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<() -> ()>) -> ()
79 subroutine pass_array_to_proc(a)
80 integer(4) :: a(10,10)
81 call takes_proc(a)
82 end subroutine
83 ! 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<() -> ()>) -> ()
89 ! Test procedure conversion.
91 subroutine pass_char_proc_to_proc(a)
92 character(8), external :: a
93 call takes_proc(a)
94 end subroutine
95 ! 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<() -> ()>) -> ()
102 subroutine pass_proc_to_proc(a)
103 external :: a
104 call takes_proc(a)
105 end subroutine
106 ! CHECK-LABEL: func.func @_QPpass_proc_to_proc(
107 ! CHECK-SAME: %[[arg0:.*]]: !fir.boxproc<() -> ()>
108 ! CHECK: fir.call @_QPtakes_proc(%[[arg0]]) {{.*}}: (!fir.boxproc<() -> ()>) -> ()
110 ! Test conversion from procedure to other data types.
112 ! CHECK-LABEL: func.func @_QPtest_conversion_from_proc(
113 subroutine test_conversion_from_proc
114 external :: proc
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)
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)
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)
131 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
132 ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : (() -> ()) -> !fir.ref<!fir.complex<4>>
133 ! CHECK: fir.call @_QPpass_complex_to_proc(%[[convert]])
134 call pass_complex_to_proc(proc)
136 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
137 ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : (() -> ()) -> !fir.ref<!fir.char<1,?>>
138 ! CHECK: %[[len:.*]] = fir.undefined index
139 ! CHECK: %[[box:.*]] = fir.emboxchar %[[convert]], %[[len]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
140 ! CHECK: fir.call @_QPpass_char_to_proc(%[[box]])
141 call pass_char_to_proc(proc)
143 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
144 ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : (() -> ()) -> !fir.ref<!fir.type<_QFpass_dt_to_procTdt{i:i32,j:i32}>>
145 ! CHECK: fir.call @_QPpass_dt_to_proc(%[[convert]])
146 call pass_dt_to_proc(proc)
148 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
149 ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : (() -> ()) -> !fir.ref<!fir.array<10x10xi32>>
150 ! CHECK: fir.call @_QPpass_array_to_proc(%[[convert]])
151 call pass_array_to_proc(proc)
153 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
154 ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[proc]] : (() -> ()) -> !fir.boxproc<() -> ()>
155 ! CHECK: %[[len:.*]] = fir.undefined i64
156 ! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>
157 ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>
158 ! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[len]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>
159 ! CHECK: fir.call @_QPpass_char_proc_to_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
160 call pass_char_proc_to_proc(proc)
162 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPproc) : () -> ()
163 ! CHECK: %[[box:.*]] = fir.emboxproc %[[proc]] : (() -> ()) -> !fir.boxproc<() -> ()>
164 ! CHECK: fir.call @_QPpass_proc_to_proc(%[[box]])
165 call pass_proc_to_proc(proc)
166 end subroutine
168 ! Test reference to char procedure conversion.
170 subroutine takes_char_proc(cp)
171 character(8), external :: cp
172 end subroutine
174 subroutine pass_int_to_char_proc(a)
175 integer(4) :: a
176 call takes_char_proc(a)
177 end subroutine
178 ! CHECK-LABEL: func.func @_QPpass_int_to_char_proc(
179 ! CHECK-SAME: %[[arg0:.*]]: !fir.ref<i32>
180 ! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<i32>) -> (() -> ())
181 ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>
182 ! CHECK: %[[charLen:.*]] = fir.undefined i64
183 ! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>
184 ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>
185 ! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>
186 ! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
188 subroutine pass_logical_to_char_proc(a)
189 logical(4) :: a
190 call takes_char_proc(a)
191 end subroutine
192 ! CHECK-LABEL: func.func @_QPpass_logical_to_char_proc(
193 ! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.logical<4>>
194 ! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<!fir.logical<4>>) -> (() -> ())
195 ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>
196 ! CHECK: %[[charLen:.*]] = fir.undefined i64
197 ! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>
198 ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>
199 ! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>
200 ! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
202 subroutine pass_real_to_char_proc(a)
203 real(8) :: a
204 call takes_char_proc(a)
205 end subroutine
206 ! CHECK-LABEL: func.func @_QPpass_real_to_char_proc(
207 ! CHECK-SAME: %[[arg0:.*]]: !fir.ref<f64>
208 ! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<f64>) -> (() -> ())
209 ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>
210 ! CHECK: %[[charLen:.*]] = fir.undefined i64
211 ! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>
212 ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>
213 ! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>
214 ! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
216 subroutine pass_complex_to_char_proc(a)
217 complex(4) :: a
218 call takes_char_proc(a)
219 end subroutine
220 ! CHECK-LABEL: func.func @_QPpass_complex_to_char_proc(
221 ! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.complex<4>>
222 ! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<!fir.complex<4>>) -> (() -> ())
223 ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>
224 ! CHECK: %[[charLen:.*]] = fir.undefined i64
225 ! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>
226 ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>
227 ! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>
228 ! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
230 subroutine pass_char_to_char_proc(a)
231 character(8) :: a
232 call takes_char_proc(a)
233 end subroutine
234 ! CHECK-LABEL: func.func @_QPpass_char_to_char_proc(
235 ! CHECK-SAME: %[[arg0:.*]]: !fir.boxchar<1>
236 ! CHECK: %[[charRefAndLen:.*]]:2 = fir.unboxchar %[[arg0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
237 ! CHECK: %[[charRef:.*]] = fir.convert %[[charRefAndLen]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1,8>>
238 ! CHECK: %[[charLen:.*]] = arith.constant 8 : index
239 ! CHECK: %[[procAddr:.*]] = fir.convert %[[charRef]] : (!fir.ref<!fir.char<1,8>>) -> (() -> ())
240 ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>
241 ! CHECK: %[[charLen2:.*]] = fir.convert %[[charLen]] : (index) -> i64
242 ! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>
243 ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>
244 ! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen2]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>
245 ! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
247 subroutine pass_dt_to_char_proc(a)
248 type :: dt
249 integer(4) :: i, j
250 end type
251 type(dt) :: a
253 call takes_char_proc(a)
254 end subroutine
255 ! CHECK-LABEL: func.func @_QPpass_dt_to_char_proc(
256 ! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.type<_QFpass_dt_to_char_procTdt{i:i32,j:i32}>>
257 ! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<!fir.type<_QFpass_dt_to_char_procTdt{i:i32,j:i32}>>) -> (() -> ())
258 ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>
259 ! CHECK: %[[charLen:.*]] = fir.undefined i64
260 ! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>
261 ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>
262 ! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>
263 ! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
265 subroutine pass_array_to_char_proc(a)
266 integer(4) :: a(10,10)
267 call takes_char_proc(a)
268 end subroutine
269 ! CHECK-LABEL: func.func @_QPpass_array_to_char_proc(
270 ! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<10x10xi32>>
271 ! CHECK: %[[procAddr:.*]] = fir.convert %[[arg0]] : (!fir.ref<!fir.array<10x10xi32>>) -> (() -> ())
272 ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>
273 ! CHECK: %[[charLen:.*]] = fir.undefined i64
274 ! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>
275 ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>
276 ! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>
277 ! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
279 ! Test procedure conversion.
281 subroutine pass_proc_to_char_proc(a)
282 external :: a
283 call takes_char_proc(a)
284 end subroutine
285 ! CHECK-LABEL: func.func @_QPpass_proc_to_char_proc(
286 ! CHECK-SAME: %[[arg0:.*]]: !fir.boxproc<() -> ()>
287 ! CHECK: %[[procAddr:.*]] = fir.box_addr %[[arg0]] : (!fir.boxproc<() -> ()>) -> (() -> ())
288 ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>
289 ! CHECK: %[[charLen:.*]] = fir.undefined i64
290 ! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>
291 ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>
292 ! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>
293 ! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
295 subroutine pass_char_proc_to_char_proc(a)
296 character(8), external :: a
297 call takes_char_proc(a)
298 end subroutine
299 ! CHECK-LABEL: func.func @_QPpass_char_proc_to_char_proc(
300 ! CHECK-SAME: %[[arg0:.*]]: tuple<!fir.boxproc<() -> ()>, i64>
301 ! CHECK: %[[boxProc:.*]] = fir.extract_value %arg0, [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>) -> !fir.boxproc<() -> ()>
302 ! CHECK: %[[procAddr:.*]] = fir.box_addr %[[boxProc]] : (!fir.boxproc<() -> ()>) -> (() -> ())
303 ! CHECK: %[[charLen:.*]] = arith.constant 8 : i64
304 ! CHECK: %[[boxProc2:.*]] = fir.emboxproc %[[procAddr]] : (() -> ()) -> !fir.boxproc<() -> ()>
305 ! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>
306 ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc2]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>
307 ! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[charLen]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>
308 ! CHECK: fir.call @_QPtakes_char_proc(%[[tuple3]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()
310 ! Test conversion from character procedure to other data types.
312 ! CHECK-LABEL: func.func @_QPtest_conversion_from_char_proc(
313 subroutine test_conversion_from_char_proc
314 character(8), external :: char_proc
316 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>
317 ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.ref<i32>
318 ! CHECK: fir.call @_QPpass_int_to_char_proc(%[[convert]])
319 call pass_int_to_char_proc(char_proc)
321 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>
322 ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.ref<!fir.logical<4>>
323 ! CHECK: fir.call @_QPpass_logical_to_char_proc(%[[convert]])
324 call pass_logical_to_char_proc(char_proc)
326 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>
327 ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.ref<f64>
328 ! CHECK: fir.call @_QPpass_real_to_char_proc(%[[convert]])
329 call pass_real_to_char_proc(char_proc)
331 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>
332 ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.ref<!fir.complex<4>>
333 ! CHECK: fir.call @_QPpass_complex_to_char_proc(%[[convert]])
334 call pass_complex_to_char_proc(char_proc)
336 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>
337 ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.ref<!fir.char<1,?>>
338 ! CHECK: %[[len:.*]] = fir.undefined index
339 ! CHECK: %[[box:.*]] = fir.emboxchar %[[convert]], %[[len]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
340 ! CHECK: fir.call @_QPpass_char_to_char_proc(%[[box]])
341 call pass_char_to_char_proc(char_proc)
343 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>
344 ! 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}>>
345 ! CHECK: fir.call @_QPpass_dt_to_char_proc(%[[convert]])
346 call pass_dt_to_char_proc(char_proc)
348 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>
349 ! CHECK: %[[convert:.*]] = fir.convert %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.ref<!fir.array<10x10xi32>>
350 ! CHECK: fir.call @_QPpass_array_to_char_proc(%[[convert]])
351 call pass_array_to_char_proc(char_proc)
353 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>
354 ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>
355 ! CHECK: fir.call @_QPpass_proc_to_char_proc(%[[boxProc]])
356 call pass_proc_to_char_proc(char_proc)
358 ! CHECK: %[[proc:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>
359 ! CHECK: %[[len:.*]] = arith.constant 8 : i64
360 ! CHECK: %[[boxProc:.*]] = fir.emboxproc %[[proc]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>
361 ! CHECK: %[[tuple:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>
362 ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple]], %[[boxProc]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>
363 ! CHECK: %[[tuple3:.*]] = fir.insert_value %[[tuple2]], %[[len]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>
364 ! CHECK: fir.call @_QPpass_char_proc_to_char_proc(%[[tuple3]])
365 call pass_char_proc_to_char_proc(char_proc)
366 end subroutine