// RUN: %target-swift-frontend -emit-silgen -sdk %S/Inputs -I %S/Inputs -enable-source-import %s | %FileCheck %s // FIXME: rdar://problem/19648117 Needs splitting objc parts out // XFAIL: linux import Foundation // FIXME: Should go into the standard library. public extension _ObjectiveCBridgeable { static func _unconditionallyBridgeFromObjectiveC(_ source: _ObjectiveCType?) -> Self { var result: Self? _forceBridgeFromObjectiveC(source!, result: &result) return result! } } class BridgedObjC : NSObject { } func == (x: BridgedObjC, y: BridgedObjC) -> Bool { return true } struct BridgedSwift : Hashable, _ObjectiveCBridgeable { var hashValue: Int { return 0 } func _bridgeToObjectiveC() -> BridgedObjC { return BridgedObjC() } static func _forceBridgeFromObjectiveC( _ x: BridgedObjC, result: inout BridgedSwift? ) { } static func _conditionallyBridgeFromObjectiveC( _ x: BridgedObjC, result: inout BridgedSwift? ) -> Bool { return true } } func == (x: BridgedSwift, y: BridgedSwift) -> Bool { return true } // CHECK-LABEL: sil hidden @_T017collection_upcast15testArrayUpcast{{.*}}F : // CHECK: bb0([[ARRAY:%[0-9]+]] : $Array): func testArrayUpcast(_ array: [BridgedObjC]) { // CHECK: [[BORROWED_ARRAY:%.*]] = begin_borrow [[ARRAY]] // CHECK: [[ARRAY_COPY:%.*]] = copy_value [[BORROWED_ARRAY]] // CHECK: [[UPCAST_FN:%[0-9]+]] = function_ref @_T0s15_arrayForceCast{{.*}}F : $@convention(thin) <τ_0_0, τ_0_1> (@owned Array<τ_0_0>) -> @owned Array<τ_0_1> // CHECK: [[RESULT:%.*]] = apply [[UPCAST_FN]]([[ARRAY_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1> (@owned Array<τ_0_0>) -> @owned Array<τ_0_1> // // => SEMANTIC SIL TODO: This is benign, but this end borrow should be after // the destroy_value // // CHECK: end_borrow [[BORROWED_ARRAY]] from [[ARRAY]] // CHECK: destroy_value [[RESULT]] // CHECK: destroy_value [[ARRAY]] let anyObjectArr: [AnyObject] = array } // CHECK: } // end sil function '_T017collection_upcast15testArrayUpcast{{.*}}F' // CHECK-LABEL: sil hidden @_T017collection_upcast22testArrayUpcastBridged{{.*}}F // CHECK: bb0([[ARRAY:%[0-9]+]] : $Array): func testArrayUpcastBridged(_ array: [BridgedSwift]) { // CHECK: [[BORROWED_ARRAY:%.*]] = begin_borrow [[ARRAY]] // CHECK: [[ARRAY_COPY:%.*]] = copy_value [[BORROWED_ARRAY]] // CHECK: [[BRIDGE_FN:%[0-9]+]] = function_ref @_T0s15_arrayForceCast{{.*}}F : $@convention(thin) <τ_0_0, τ_0_1> (@owned Array<τ_0_0>) -> @owned Array<τ_0_1> // CHECK: [[RESULT:%.*]] = apply [[BRIDGE_FN]]([[ARRAY_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1> (@owned Array<τ_0_0>) -> @owned Array<τ_0_1> // CHECK: end_borrow [[BORROWED_ARRAY]] from [[ARRAY]] // CHECK: destroy_value [[RESULT]] // CHECK: destroy_value [[ARRAY]] let anyObjectArr = array as [AnyObject] } // CHECK: } // end sil function '_T017collection_upcast22testArrayUpcastBridged{{.*}}F' // CHECK-LABEL: sil hidden @_T017collection_upcast20testDictionaryUpcast{{.*}}F // CHECK: bb0([[DICT:%[0-9]+]] : $Dictionary): func testDictionaryUpcast(_ dict: Dictionary) { // CHECK: [[BORROWED_DICT:%.*]] = begin_borrow [[DICT]] // CHECK: [[DICT_COPY:%.*]] = copy_value [[BORROWED_DICT]] // CHECK: [[UPCAST_FN:%[0-9]+]] = function_ref @_T0s17_dictionaryUpCast{{.*}}F : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@owned Dictionary<τ_0_0, τ_0_1>) -> @owned Dictionary<τ_0_2, τ_0_3> // CHECK: [[RESULT:%.*]] = apply [[UPCAST_FN]]([[DICT_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@owned Dictionary<τ_0_0, τ_0_1>) -> @owned Dictionary<τ_0_2, τ_0_3> // CHECK: end_borrow [[BORROWED_DICT]] from [[DICT]] // CHECK: destroy_value [[RESULT]] // CHECK: destroy_value [[DICT]] let anyObjectDict: Dictionary = dict } // CHECK-LABEL: sil hidden @_T017collection_upcast27testDictionaryUpcastBridged{{.*}}F // CHECK: bb0([[DICT:%[0-9]+]] : $Dictionary): func testDictionaryUpcastBridged(_ dict: Dictionary) { // CHECK: [[BORROWED_DICT:%.*]] = begin_borrow [[DICT]] // CHECK: [[DICT_COPY:%.*]] = copy_value [[BORROWED_DICT]] // CHECK: [[BRIDGE_FN:%[0-9]+]] = function_ref @_T0s17_dictionaryUpCast{{.*}}F // CHECK: [[RESULT:%.*]] = apply [[BRIDGE_FN]]([[DICT_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@owned Dictionary<τ_0_0, τ_0_1>) -> @owned Dictionary<τ_0_2, τ_0_3> // CHECK: end_borrow [[BORROWED_DICT]] from [[DICT]] // CHECK: destroy_value [[RESULT]] // CHECK: destroy_value [[DICT]] let anyObjectDict = dict as Dictionary } // CHECK-LABEL: sil hidden @_T017collection_upcast13testSetUpcast{{.*}}F // CHECK: bb0([[SET:%[0-9]+]] : $Set): func testSetUpcast(_ dict: Set) { // CHECK: [[BORROWED_SET:%.*]] = begin_borrow [[SET]] // CHECK: [[SET_COPY:%.*]] = copy_value [[BORROWED_SET]] // CHECK: [[BRIDGE_FN:%[0-9]+]] = function_ref @_T0s10_setUpCast{{.*}}F : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@owned Set<τ_0_0>) -> @owned Set<τ_0_1> // CHECK: [[RESULT:%.*]] = apply [[BRIDGE_FN]]([[SET_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@owned Set<τ_0_0>) -> @owned Set<τ_0_1> // CHECK: end_borrow [[BORROWED_SET]] from [[SET]] // CHECK: destroy_value [[RESULT]] // CHECK: destroy_value [[SET]] let anyObjectSet: Set = dict } // CHECK-LABEL: sil hidden @_T017collection_upcast20testSetUpcastBridged{{.*}}F // CHECK: bb0([[SET:%.*]] : $Set): func testSetUpcastBridged(_ set: Set) { // CHECK: [[BORROWED_SET:%.*]] = begin_borrow [[SET]] // CHECK: [[SET_COPY:%.*]] = copy_value [[BORROWED_SET]] // CHECK: [[BRIDGE_FN:%[0-9]+]] = function_ref @_T0s10_setUpCast{{.*}}F // CHECK: [[RESULT:%.*]] = apply [[BRIDGE_FN]]([[SET_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@owned Set<τ_0_0>) -> @owned Set<τ_0_1> // CHECK: end_borrow [[BORROWED_SET]] from [[SET]] // CHECK: destroy_value [[RESULT]] // CHECK: destroy_value [[SET]] let anyObjectSet = set as Set }