@@ -637,3 +637,36 @@ func callNonStandardBlock(value: Int) {
637
637
// CHECK: enum $Optional<@convention(block) () -> @owned Optional<AnyObject>>
638
638
takesNonStandardBlock { return value }
639
639
}
640
+
641
+ func takeTwoAnys( _ lhs: Any , _ rhs: Any ) -> Any { return lhs }
642
+
643
+ // CHECK-LABEL: sil hidden @_T013objc_bridging22defineNonStandardBlockyyp1x_tF
644
+ func defineNonStandardBlock( x: Any ) {
645
+ // CHECK: function_ref @_T013objc_bridging22defineNonStandardBlockyyp1x_tFypypcfU_
646
+ // CHECK: function_ref @_T0ypypIxir_yXlyXlIyBya_TR : $@convention(c) (@inout_aliasable @block_storage @callee_owned (@in Any) -> @out Any, AnyObject) -> @autoreleased AnyObject
647
+
648
+ let fn : @convention ( block) ( Any ) -> Any = { y in takeTwoAnys ( x, y) }
649
+ }
650
+
651
+ // CHECK-LABEL: sil shared [transparent] [serializable] [reabstraction_thunk] @_T0ypypIxir_yXlyXlIyBya_TR : $@convention(c) (@inout_aliasable @block_storage @callee_owned (@in Any) -> @out Any, AnyObject) -> @autoreleased AnyObject
652
+ // CHECK: bb0(%0 : $*@block_storage @callee_owned (@in Any) -> @out Any, %1 : $AnyObject):
653
+ // CHECK: [[T0:%.*]] = copy_value %1 : $AnyObject
654
+ // CHECK: [[T1:%.*]] = open_existential_ref [[T0]] : $AnyObject
655
+ // CHECK: [[ARG:%.*]] = alloc_stack $Any
656
+ // CHECK: [[T2:%.*]] = init_existential_addr [[ARG]]
657
+ // CHECK: store [[T1]] to [init] [[T2]]
658
+ // CHECK: [[RESULT:%.*]] = alloc_stack $Any
659
+ // CHECK: apply {{.*}}([[RESULT]], [[ARG]])
660
+
661
+ // CHECK-LABEL: sil hidden @_T013objc_bridging15castToCFunctionySV3ptr_tF : $@convention(thin) (UnsafeRawPointer) -> () {
662
+ func castToCFunction( ptr: UnsafeRawPointer ) {
663
+ // CHECK: [[CASTFN:%.*]] = function_ref @_T0s13unsafeBitCastq_x_q_m2totr0_lF
664
+ // CHECK: [[OUT:%.*]] = alloc_stack $@convention(c) (Optional<AnyObject>) -> ()
665
+ // CHECK: [[IN:%.]] = alloc_stack $UnsafeRawPointer
666
+ // CHECK: store %0 to [trivial] [[IN]] : $*UnsafeRawPointer
667
+ // CHECK: [[META:%.*]] = metatype $@thick (@convention(c) (Optional<AnyObject>) -> ()).Type
668
+ // CHECK: apply [[CASTFN]]<UnsafeRawPointer, @convention(c) (AnyObject?) -> ()>([[OUT]], [[IN]], [[META]]) : $@convention(thin) <τ_0_0, τ_0_1> (@in τ_0_0, @thick τ_0_1.Type) -> @out τ_0_1
669
+ // CHECK: [[RESULT:%.*]] = load [trivial] %3 : $*@convention(c) (Optional<AnyObject>) -> ()
670
+ typealias Fn = @convention ( c) ( AnyObject ? ) -> Void
671
+ unsafeBitCast ( ptr, to: Fn . self) ( nil )
672
+ }
0 commit comments