@@ -174,12 +174,84 @@ func bridgeNonnullBlockResult() {
174
174
nonnullStringBlockResult { return " test " }
175
175
}
176
176
177
- // CHECK-LABEL: sil hidden @{{.*}}bridgeNoescapeBlock{{.*}}
178
- func bridgeNoescapeBlock( ) {
179
- // CHECK: function_ref @$SIg_IyB_TR
177
+ // CHECK-LABEL: sil hidden @$S20objc_blocks_bridging19bridgeNoescapeBlock2fnyyyXE_tF
178
+ func bridgeNoescapeBlock( fn: ( ) -> ( ) ) {
179
+ // CHECK: [[CLOSURE_FN:%.*]] = function_ref @$S20objc_blocks_bridging19bridgeNoescapeBlock2fnyyyXE_tFyyXEfU_
180
+ // CHECK: [[CONV_FN:%.*]] = convert_function [[CLOSURE_FN]]
181
+ // CHECK: [[THICK_FN:%.*]] = thin_to_thick_function [[CONV_FN]]
182
+ // CHECK: [[BLOCK_ALLOC:%.*]] = alloc_stack $@block_storage @noescape @callee_guaranteed () -> ()
183
+ // CHECK: [[BLOCK_ADDR:%.*]] = project_block_storage [[BLOCK_ALLOC]]
184
+ // CHECK: store [[THICK_FN]] to [trivial] [[BLOCK_ADDR]]
185
+ // CHECK: [[THUNK:%.*]] = function_ref @$SIg_IyB_TR : $@convention(c) (@inout_aliasable @block_storage @noescape @callee_guaranteed () -> ()) -> ()
186
+ // CHECK: [[BLOCK_STACK:%.*]] = init_block_storage_header [[BLOCK_ALLOC]] : {{.*}}, invoke [[THUNK]] : {{.*}}
187
+
188
+ // FIXME: We're passing the block as a no-escape -- so we don't have to copy it
189
+ // CHECK: [[BLOCK:%.*]] = copy_block [[BLOCK_STACK]]
190
+
191
+ // CHECK: [[SOME_BLOCK:%.*]] = enum $Optional<@convention(block) @noescape () -> ()>, #Optional.some!enumelt.1, [[BLOCK]]
192
+ // CHECK: dealloc_stack [[BLOCK_ALLOC]]
193
+ // CHECK: [[FN:%.*]] = function_ref @noescapeBlock : $@convention(c) (Optional<@convention(block) @noescape () -> ()>) -> ()
194
+ // CHECK: apply [[FN]]([[SOME_BLOCK]])
195
+ noescapeBlock { }
196
+ // CHECK: destroy_value [[SOME_BLOCK]]
197
+
198
+ // CHECK: [[BLOCK_ALLOC:%.*]] = alloc_stack $@block_storage @noescape @callee_guaranteed () -> ()
199
+ // CHECK: [[BLOCK_ADDR:%.*]] = project_block_storage [[BLOCK_ALLOC]]
200
+ // CHECK: store %0 to [trivial] [[BLOCK_ADDR]]
201
+ // CHECK: [[THUNK:%.*]] = function_ref @$SIg_IyB_TR : $@convention(c) (@inout_aliasable @block_storage @noescape @callee_guaranteed () -> ()) -> ()
202
+ // CHECK: [[BLOCK_STACK:%.*]] = init_block_storage_header [[BLOCK_ALLOC]] : {{.*}}, invoke [[THUNK]] : {{.*}}
203
+
204
+ // FIXME: We're passing the block as a no-escape -- so we don't have to copy it
205
+ // CHECK: [[BLOCK:%.*]] = copy_block [[BLOCK_STACK]]
206
+
207
+ // CHECK: [[SOME_BLOCK:%.*]] = enum $Optional<@convention(block) @noescape () -> ()>, #Optional.some!enumelt.1, [[BLOCK]]
208
+ // CHECK: dealloc_stack [[BLOCK_ALLOC]]
209
+ // CHECK: [[FN:%.*]] = function_ref @noescapeBlock : $@convention(c) (Optional<@convention(block) @noescape () -> ()>) -> ()
210
+ // CHECK: apply [[FN]]([[SOME_BLOCK]])
211
+ noescapeBlock ( fn)
212
+ // CHECK: destroy_value [[SOME_BLOCK]]
213
+
214
+ // CHECK: [[NIL_BLOCK:%.*]] = enum $Optional<@convention(block) @noescape () -> ()>, #Optional.none!enumelt
215
+ // CHECK: [[FN:%.*]] = function_ref @noescapeBlock : $@convention(c) (Optional<@convention(block) @noescape () -> ()>) -> ()
216
+ // CHECK: apply [[FN]]([[NIL_BLOCK]])
217
+ noescapeBlock ( nil )
218
+
219
+ // CHECK: [[CLOSURE_FN:%.*]] = function_ref @$S20objc_blocks_bridging19bridgeNoescapeBlock2fnyyyXE_tFyyXEfU0_
220
+ // CHECK: [[CONV_FN:%.*]] = convert_function [[CLOSURE_FN]]
221
+ // CHECK: [[THICK_FN:%.*]] = thin_to_thick_function [[CONV_FN]]
222
+ // CHECK: [[BLOCK_ALLOC:%.*]] = alloc_stack $@block_storage @noescape @callee_guaranteed () -> ()
223
+ // CHECK: [[BLOCK_ADDR:%.*]] = project_block_storage [[BLOCK_ALLOC]]
224
+ // CHECK: store [[THICK_FN]] to [trivial] [[BLOCK_ADDR]]
225
+ // CHECK: [[THUNK:%.*]] = function_ref @$SIg_IyB_TR : $@convention(c) (@inout_aliasable @block_storage @noescape @callee_guaranteed () -> ()) -> ()
226
+ // CHECK: [[BLOCK_STACK:%.*]] = init_block_storage_header [[BLOCK_ALLOC]] : {{.*}}, invoke [[THUNK]] : {{.*}}
227
+
228
+ // FIXME: We're passing the block as a no-escape -- so we don't have to copy it
229
+ // CHECK: [[BLOCK:%.*]] = copy_block [[BLOCK_STACK]]
230
+
231
+ // CHECK: [[FN:%.*]] = function_ref @noescapeNonnullBlock : $@convention(c) (@convention(block) @noescape () -> ()) -> ()
232
+ // CHECK: apply [[FN]]([[BLOCK]])
233
+ noescapeNonnullBlock { }
234
+ // CHECK: destroy_value [[BLOCK]]
235
+
236
+ // CHECK: [[BLOCK_ALLOC:%.*]] = alloc_stack $@block_storage @noescape @callee_guaranteed () -> ()
237
+ // CHECK: [[BLOCK_ADDR:%.*]] = project_block_storage [[BLOCK_ALLOC]]
238
+ // CHECK: store %0 to [trivial] [[BLOCK_ADDR]]
239
+ // CHECK: [[THUNK:%.*]] = function_ref @$SIg_IyB_TR : $@convention(c) (@inout_aliasable @block_storage @noescape @callee_guaranteed () -> ()) -> ()
240
+ // CHECK: [[BLOCK_STACK:%.*]] = init_block_storage_header [[BLOCK_ALLOC]] : {{.*}}, invoke [[THUNK]] : {{.*}}
241
+
242
+ // FIXME: We're passing the block as a no-escape -- so we don't have to copy it
243
+ // CHECK: [[BLOCK:%.*]] = copy_block [[BLOCK_STACK]]
244
+
245
+ // CHECK: [[FN:%.*]] = function_ref @noescapeNonnullBlock : $@convention(c) (@convention(block) @noescape () -> ()) -> ()
246
+ // CHECK: apply [[FN]]([[BLOCK]])
247
+ noescapeNonnullBlock ( fn)
248
+
180
249
noescapeBlockAlias { }
181
- // CHECK: function_ref @$SIg_IyB_TR
250
+ noescapeBlockAlias ( fn)
251
+ noescapeBlockAlias ( nil )
252
+
182
253
noescapeNonnullBlockAlias { }
254
+ noescapeNonnullBlockAlias ( fn)
183
255
}
184
256
185
257
class ObjCClass : NSObject { }
0 commit comments