1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
// RUN: %empty-directory(%t)
// RUN: %build-silgen-test-overlays
// RUN: %target-swift-emit-silgen(mock-sdk: -sdk %S/Inputs -I %t) -module-name objc_bridged_results %s -Xllvm -sil-print-debuginfo -import-objc-header %S/Inputs/objc_bridged_results.h | %FileCheck %s
// REQUIRES: objc_interop
import Foundation
// CHECK-LABEL: sil hidden [ossa] @$s20objc_bridged_results11testNonnullySayypGSo4TestCF
// CHECK: bb0([[ARG:%.*]] : @guaranteed $Test):
// CHECK: [[METHOD:%[0-9]+]] = objc_method [[ARG]] : $Test, #Test.nonnullArray!getter.foreign : (Test) -> () -> [Any], $@convention(objc_method) (Test) -> @autoreleased Optional<NSArray>
// CHECK: [[COCOA_VAL:%[0-9]+]] = apply [[METHOD]]([[ARG]]) : $@convention(objc_method) (Test) -> @autoreleased Optional<NSArray>
// CHECK: [[CONVERT:%[0-9]+]] = function_ref @$sSa10FoundationE36_unconditionallyBridgeFromObjectiveCySayxGSo7NSArrayCSgFZ
// CHECK: [[ARRAY_META:%[0-9]+]] = metatype $@thin Array<Any>.Type
// CHECK: [[RESULT:%[0-9]+]] = apply [[CONVERT]]<Any>([[COCOA_VAL]], [[ARRAY_META]])
// CHECK-NOT: destroy_value %0 : $Test
// CHECK: return [[RESULT]] : $Array<Any>
func testNonnull(_ obj: Test) -> [Any] {
return obj.nonnullArray
} // CHECK: } // end sil function '$s20objc_bridged_results11testNonnullySayypGSo4TestCF'
// CHECK-LABEL: sil hidden [ossa] @$s20objc_bridged_results12testNullableySayypGSgSo4TestCF
func testNullable(_ obj: Test) -> [Any]? {
// CHECK: bb0([[ARG:%.*]] : @guaranteed $Test):
// CHECK: [[METHOD:%[0-9]+]] = objc_method [[ARG]] : $Test, #Test.nullableArray!getter.foreign : (Test) -> () -> [Any]?, $@convention(objc_method) (Test) -> @autoreleased Optional<NSArray>
// CHECK: [[COCOA_VAL:%[0-9]+]] = apply [[METHOD]]([[ARG]]) : $@convention(objc_method) (Test) -> @autoreleased Optional<NSArray>
// CHECK: switch_enum [[COCOA_VAL]] : $Optional<NSArray>, case #Optional.some!enumelt: [[CASE_NON_NIL:bb[0-9]+]], case #Optional.none!enumelt: [[CASE_NIL:bb[0-9]+]]
//
// CHECK: [[CASE_NON_NIL]]([[COCOA_VAL_NON_NIL:%.*]] : @owned $NSArray):
// CHECK-NOT: unchecked_enum_data
// CHECK: [[CONVERT:%[0-9]+]] = function_ref @$sSa10FoundationE36_unconditionallyBridgeFromObjectiveCySayxGSo7NSArrayCSgFZ
// CHECK: [[COCOA_SOME_VAL:%[0-9]+]] = enum $Optional<NSArray>, #Optional.some!enumelt, [[COCOA_VAL_NON_NIL]]
// CHECK: [[ARRAY_META:%[0-9]+]] = metatype $@thin Array<Any>.Type
// CHECK: [[RESULT_VAL:%[0-9]+]] = apply [[CONVERT]]<Any>([[COCOA_SOME_VAL]], [[ARRAY_META]])
// CHECK: [[RESULT_SOME:%[0-9]+]] = enum $Optional<Array<Any>>, #Optional.some!enumelt, [[RESULT_VAL]] : $Array<Any>
// CHECK: br [[FINISH:bb[0-9]+]]([[RESULT_SOME]] : $Optional<Array<Any>>)
// CHECK: [[CASE_NIL]]:
// CHECK: [[RESULT_NONE:%[0-9]+]] = enum $Optional<Array<Any>>, #Optional.none!enumelt
// CHECK: br [[FINISH]]([[RESULT_NONE]] : $Optional<Array<Any>>)
// CHECK: [[FINISH]]([[RESULT:%[0-9]+]] : @owned $Optional<Array<Any>>):
// CHECK-NOT: destroy_value [[ARG]] : $Test
// CHECK: return [[RESULT]] : $Optional<Array<Any>>
return obj.nullableArray
} // CHECK: } // end sil function '$s20objc_bridged_results12testNullableySayypGSgSo4TestCF'
// CHECK-LABEL: sil hidden [ossa] @$s20objc_bridged_results19testNullUnspecifiedySayypGSgSo4TestCF
func testNullUnspecified(_ obj: Test) -> [Any]! {
// CHECK: bb0([[ARG:%.*]] : @guaranteed $Test):
// CHECK: [[METHOD:%[0-9]+]] = objc_method [[ARG]] : $Test, #Test.nullUnspecifiedArray!getter.foreign : (Test) -> () -> [Any]?, $@convention(objc_method) (Test) -> @autoreleased Optional<NSArray>
// CHECK: [[COCOA_VAL:%[0-9]+]] = apply [[METHOD]]([[ARG]]) : $@convention(objc_method) (Test) -> @autoreleased Optional<NSArray>
// CHECK: switch_enum [[COCOA_VAL]] : $Optional<NSArray>, case #Optional.some!enumelt: [[CASE_NON_NIL:bb[0-9]+]], case #Optional.none!enumelt: [[CASE_NIL:bb[0-9]+]]
// CHECK: [[CASE_NON_NIL]]([[COCOA_VAL_NON_NIL:%.*]] : @owned $NSArray):
// CHECK-NOT: unchecked_enum_data
// CHECK: [[CONVERT:%[0-9]+]] = function_ref @$sSa10FoundationE36_unconditionallyBridgeFromObjectiveCySayxGSo7NSArrayCSgFZ
// CHECK: [[COCOA_SOME_VAL:%[0-9]+]] = enum $Optional<NSArray>, #Optional.some!enumelt, [[COCOA_VAL_NON_NIL]]
// CHECK: [[ARRAY_META:%[0-9]+]] = metatype $@thin Array<Any>.Type
// CHECK: [[RESULT_VAL:%[0-9]+]] = apply [[CONVERT]]<Any>([[COCOA_SOME_VAL]], [[ARRAY_META]])
// CHECK: [[RESULT_SOME:%[0-9]+]] = enum $Optional<Array<Any>>, #Optional.some!enumelt, [[RESULT_VAL]] : $Array<Any>
// CHECK: br [[FINISH:bb[0-9]+]]([[RESULT_SOME]] : $Optional<Array<Any>>)
// CHECK: [[CASE_NIL]]:
// CHECK: [[RESULT_NONE:%[0-9]+]] = enum $Optional<Array<Any>>, #Optional.none!enumelt
// CHECK: br [[FINISH]]([[RESULT_NONE]] : $Optional<Array<Any>>)
// CHECK: [[FINISH]]([[RESULT:%[0-9]+]] : @owned $Optional<Array<Any>>):
// CHECK-NOT: destroy_value [[ARG]] : $Test
// CHECK: return [[RESULT]] : $Optional<Array<Any>>
return obj.nullUnspecifiedArray
} // CHECK: } // end sil function '$s20objc_bridged_results19testNullUnspecifiedySayypGSgSo4TestCF'
// CHECK-LABEL: sil hidden [ossa] @$s20objc_bridged_results21testNonnullDictionaryySDys11AnyHashableVypGSo4TestCF
func testNonnullDictionary(_ obj: Test) -> [AnyHashable: Any] {
// CHECK: bb0([[ARG:%.*]] : @guaranteed $Test):
// CHECK: [[METHOD:%[0-9]+]] = objc_method [[ARG]] : $Test, #Test.nonnullDictionary!getter.foreign : (Test) -> () -> [AnyHashable : Any], $@convention(objc_method) (Test) -> @autoreleased Optional<NSDictionary>
// CHECK: [[COCOA_VAL:%[0-9]+]] = apply [[METHOD]]([[ARG]]) : $@convention(objc_method) (Test) -> @autoreleased Optional<NSDictionary>
// CHECK: [[CONVERT:%[0-9]+]] = function_ref @$sSD10FoundationE36_unconditionallyBridgeFromObjectiveCySDyxq_GSo12NSDictionaryCSgFZ
// CHECK: [[DICT_META:%[0-9]+]] = metatype $@thin Dictionary<AnyHashable, Any>.Type
// CHECK: [[RESULT:%[0-9]+]] = apply [[CONVERT]]<AnyHashable, Any>([[COCOA_VAL]], [[DICT_META]])
// CHECK-NOT: destroy_value [[ARG]] : $Test
// CHECK: return [[RESULT]] : $Dictionary<AnyHashable, Any>
return obj.nonnullDictionary
} // CHECK: } // end sil function '$s20objc_bridged_results21testNonnullDictionaryySDys11AnyHashableVypGSo4TestCF'
// CHECK-LABEL: sil hidden [ossa] @$s20objc_bridged_results14testNonnullSetyShys11AnyHashableVGSo4TestCF
func testNonnullSet(_ obj: Test) -> Set<AnyHashable> {
// CHECK: bb0([[ARG:%.*]] : @guaranteed $Test):
// CHECK: [[METHOD:%[0-9]+]] = objc_method [[ARG]] : $Test, #Test.nonnullSet!getter.foreign : (Test) -> () -> Set<AnyHashable>, $@convention(objc_method) (Test) -> @autoreleased Optional<NSSet>
// CHECK: [[COCOA_VAL:%[0-9]+]] = apply [[METHOD]]([[ARG]]) : $@convention(objc_method) (Test) -> @autoreleased Optional<NSSet>
// CHECK: [[CONVERT:%[0-9]+]] = function_ref @$sSh10FoundationE36_unconditionallyBridgeFromObjectiveCyShyxGSo5NSSetCSgFZ
// CHECK: [[SET_META:%[0-9]+]] = metatype $@thin Set<AnyHashable>.Type
// CHECK: [[RESULT:%[0-9]+]] = apply [[CONVERT]]<AnyHashable>([[COCOA_VAL]], [[SET_META]])
// CHECK-NOT: destroy_value [[ARG]] : $Test
// CHECK: return [[RESULT]] : $Set<AnyHashable>
return obj.nonnullSet
} // CHECK: } // end sil function '$s20objc_bridged_results14testNonnullSetyShys11AnyHashableVGSo4TestCF'
// CHECK-LABEL: sil hidden [ossa] @$s20objc_bridged_results17testNonnullStringySSSo4TestCF
func testNonnullString(_ obj: Test) -> String {
// CHECK: bb0([[ARG:%.*]] : @guaranteed $Test):
// CHECK: [[METHOD:%[0-9]+]] = objc_method [[ARG]] : $Test, #Test.nonnullString!getter.foreign : (Test) -> () -> String, $@convention(objc_method) (Test) -> @autoreleased Optional<NSString>
// CHECK: [[COCOA_VAL:%[0-9]+]] = apply [[METHOD]]([[ARG]]) : $@convention(objc_method) (Test) -> @autoreleased Optional<NSString>
// CHECK: [[CONVERT:%[0-9]+]] = function_ref @$sSS10FoundationE36_unconditionallyBridgeFromObjectiveCySSSo8NSStringCSgFZ
// CHECK: [[STRING_META:%[0-9]+]] = metatype $@thin String.Type
// CHECK: [[RESULT:%[0-9]+]] = apply [[CONVERT]]([[COCOA_VAL]], [[STRING_META]]) : $@convention(method) (@guaranteed Optional<NSString>, @thin String.Type) -> @owned String
// CHECK-NOT: destroy_value [[ARG]] : $Test
// CHECK: return [[RESULT]] : $String
return obj.nonnullString
} // CHECK: } // end sil function '$s20objc_bridged_results17testNonnullStringySSSo4TestCF'
// CHECK-LABEL: sil hidden [ossa] @$s20objc_bridged_results13testClassPropSSyF
func testClassProp() -> String {
// CHECK: [[CLASS:%.+]] = metatype $@objc_metatype Test.Type
// CHECK: [[METHOD:%.+]] = objc_method [[CLASS]] : $@objc_metatype Test.Type, #Test.nonnullSharedString!getter.foreign : (Test.Type) -> () -> String, $@convention(objc_method) (@objc_metatype Test.Type) -> @autoreleased Optional<NSString>
// CHECK: [[COCOA_VAL:%[0-9]+]] = apply [[METHOD]]([[CLASS]]) : $@convention(objc_method) (@objc_metatype Test.Type) -> @autoreleased Optional<NSString>
// CHECK: [[CONVERT:%[0-9]+]] = function_ref @$sSS10FoundationE36_unconditionallyBridgeFromObjectiveCySSSo8NSStringCSgFZ
// CHECK: [[STRING_META:%[0-9]+]] = metatype $@thin String.Type
// CHECK: [[RESULT:%[0-9]+]] = apply [[CONVERT]]([[COCOA_VAL]], [[STRING_META]]) : $@convention(method) (@guaranteed Optional<NSString>, @thin String.Type) -> @owned String
// CHECK: return [[RESULT]] : $String
return Test.nonnullSharedString
} // CHECK: } // end sil function '$s20objc_bridged_results13testClassPropSSyF'
// Note: This doesn't really "work" in that it doesn't accept a nil value the
// way the others do, because subscripts are thunked. But the main thing is
// not to crash trying to generate the thunk.
// CHECK-LABEL: sil hidden [ossa] @$s20objc_bridged_results20testNonnullSubscriptySayypGSo4TestCF
func testNonnullSubscript(_ obj: Test) -> [Any] {
// CHECK: bb0([[ARG:%.*]] : @guaranteed $Test):
// CHECK: [[METHOD:%[0-9]+]] = objc_method [[ARG]] : $Test, #Test.subscript!getter.foreign : (Test) -> (Int) -> [Any], $@convention(objc_method) (Int, Test) -> @autoreleased Optional<NSArray>
// CHECK: [[COCOA_VAL:%[0-9]+]] = apply [[METHOD]]({{%[0-9]+}}, [[ARG]]) : $@convention(objc_method) (Int, Test) -> @autoreleased Optional<NSArray>
// CHECK: [[CONVERT:%[0-9]+]] = function_ref @$sSa10FoundationE36_unconditionallyBridgeFromObjectiveCySayxGSo7NSArrayCSgFZ
// CHECK: [[ARRAY_META:%[0-9]+]] = metatype $@thin Array<Any>.Type,
// CHECK: [[RESULT:%[0-9]+]] = apply [[CONVERT]]<Any>([[COCOA_VAL]], [[ARRAY_META]])
// CHECK-NOT: destroy_value [[ARG]] : $Test
// CHECK: return [[RESULT]] : $Array<Any>
return obj[0]
} // CHECK: } // end sil function '$s20objc_bridged_results20testNonnullSubscriptySayypGSo4TestCF'
// CHECK-LABEL: sil hidden [ossa] @$s20objc_bridged_results19testPerformSelectoryySo8NSObjectCF
func testPerformSelector(_ obj: NSObject) {
// CHECK: bb0([[ARG:%.*]] : @guaranteed $NSObject):
// CHECK: [[METHOD:%[0-9]+]] = objc_method [[ARG]] : $NSObject, #NSObject.perform!foreign
// CHECK: [[RESULT:%[0-9]+]] = apply [[METHOD]]({{%[0-9]+}}, {{%[0-9]+}}, [[ARG]])
_ = obj.perform("foo", with: nil)
// CHECK-NOT: {{(retain|release).+}}[[RESULT]]
// CHECK-NOT: {{(retain|release).+}}[[RESULT]]
} // CHECK: } // end sil function '$s20objc_bridged_results19testPerformSelectoryySo8NSObjectCF'
|