// RUN: %target-swift-emit-silgen -module-name collection_downcast -sdk %S/Inputs -I %S/Inputs -enable-source-import %s | %FileCheck %s // REQUIRES: objc_interop 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 { func hash(into hasher: inout Hasher) {} 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 [ossa] @$s19collection_downcast17testArrayDowncast{{.*}}F // CHECK: bb0([[ARRAY:%[0-9]+]] : @guaranteed $Array): func testArrayDowncast(_ array: [AnyObject]) -> [BridgedObjC] { // CHECK: [[ARRAY_COPY:%.*]] = copy_value [[ARRAY]] // CHECK: [[DOWNCAST_FN:%[0-9]+]] = function_ref @$ss15_arrayForceCast{{.*}}F // CHECK: apply [[DOWNCAST_FN]]([[ARRAY_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1> (@guaranteed Array<τ_0_0>) -> @owned Array<τ_0_1> return array as! [BridgedObjC] } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast27testArrayDowncastFromObject{{.*}}F // CHECK: bb0([[OBJ:%[0-9]+]] : @guaranteed $AnyObject): func testArrayDowncastFromObject(_ obj: AnyObject) -> [BridgedObjC] { // CHECK: unconditional_checked_cast_addr AnyObject in [[OBJECT_ALLOC:%[0-9]+]] : $*AnyObject to Array in [[VALUE_ALLOC:%[0-9]+]] : $*Array return obj as! [BridgedObjC] } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast28testArrayDowncastFromNSArray{{.*}}F // CHECK: bb0([[NSARRAY_OBJ:%[0-9]+]] : @guaranteed $NSArray): func testArrayDowncastFromNSArray(_ obj: NSArray) -> [BridgedObjC] { // CHECK: unconditional_checked_cast_addr NSArray in [[OBJECT_ALLOC:%[0-9]+]] : $*NSArray to Array in [[VALUE_ALLOC:%[0-9]+]] : $*Array return obj as! [BridgedObjC] } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast28testArrayDowncastConditional{{.*}}F // CHECK: bb0([[ARRAY:%[0-9]+]] : @guaranteed $Array): func testArrayDowncastConditional(_ array: [AnyObject]) -> [BridgedObjC]? { // CHECK: [[ARRAY_COPY:%.*]] = copy_value [[ARRAY]] // CHECK: [[DOWNCAST_FN:%[0-9]+]] = function_ref @$ss21_arrayConditionalCast{{.*}}F // CHECK: apply [[DOWNCAST_FN]]([[ARRAY_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1> (@guaranteed Array<τ_0_0>) -> @owned Optional> return array as? [BridgedObjC] } // CHECK: } // end sil function '$s19collection_downcast28testArrayDowncastConditional{{.*}}F' // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast12testArrayIsa{{.*}}F // CHECK: bb0([[ARRAY:%[0-9]+]] : @guaranteed $Array) func testArrayIsa(_ array: [AnyObject]) -> Bool { // CHECK: [[ARRAY_COPY:%.*]] = copy_value [[ARRAY]] // CHECK: [[DOWNCAST_FN:%[0-9]+]] = function_ref @$ss21_arrayConditionalCast{{.*}}F // CHECK: apply [[DOWNCAST_FN]]([[ARRAY_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1> (@guaranteed Array<τ_0_0>) -> @owned Optional> // CHECK-NOT: destroy_value [[ARRAY]] return array is [BridgedObjC] ? true : false } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast24testArrayDowncastBridged{{.*}}F // CHECK: bb0([[ARRAY:%[0-9]+]] : @guaranteed $Array): func testArrayDowncastBridged(_ array: [AnyObject]) -> [BridgedSwift] { // CHECK: [[ARRAY_COPY:%.*]] = copy_value [[ARRAY]] // CHECK: [[BRIDGE_FN:%[0-9]+]] = function_ref @$ss15_arrayForceCast{{.*}}F // CHECK: apply [[BRIDGE_FN]]([[ARRAY_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1> (@guaranteed Array<τ_0_0>) -> @owned Array<τ_0_1> // CHECK-NOT: destroy_value [[ARRAY]] return array as! [BridgedSwift] } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast35testArrayDowncastBridgedConditional{{.*}}F // CHECK: bb0([[ARRAY:%[0-9]+]] : @guaranteed $Array): func testArrayDowncastBridgedConditional(_ array: [AnyObject]) -> [BridgedSwift]?{ // CHECK: [[ARRAY_COPY:%.*]] = copy_value [[ARRAY]] // CHECK: [[BRIDGE_FN:%[0-9]+]] = function_ref @$ss21_arrayConditionalCast{{.*}}F // CHECK: apply [[BRIDGE_FN]]([[ARRAY_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1> (@guaranteed Array<τ_0_0>) -> @owned Optional> // CHECK-NOT: destroy_value [[ARRAY]] return array as? [BridgedSwift] } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast19testArrayIsaBridged{{.*}}F // CHECK: bb0([[ARRAY:%[0-9]+]] : @guaranteed $Array) func testArrayIsaBridged(_ array: [AnyObject]) -> Bool { // CHECK: [[ARRAY_COPY:%.*]] = copy_value [[ARRAY]] // CHECK: [[DOWNCAST_FN:%[0-9]+]] = function_ref @$ss21_arrayConditionalCast{{.*}}F // CHECK: apply [[DOWNCAST_FN]]([[ARRAY_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1> (@guaranteed Array<τ_0_0>) -> @owned Optional> // CHECK-NOT: destroy_value [[ARRAY]] return array is [BridgedSwift] ? true : false } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast32testDictionaryDowncastFromObject{{.*}}F // CHECK: bb0([[OBJ:%[0-9]+]] : @guaranteed $AnyObject): func testDictionaryDowncastFromObject(_ obj: AnyObject) -> Dictionary { // CHECK: unconditional_checked_cast_addr AnyObject in [[OBJECT_ALLOC:%[0-9]+]] : $*AnyObject to Dictionary in [[VALUE_ALLOC:%[0-9]+]] : $*Dictionary return obj as! Dictionary } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast22testDictionaryDowncast{{.*}}F // CHECK: bb0([[DICT:%[0-9]+]] : @guaranteed $Dictionary) func testDictionaryDowncast(_ dict: Dictionary) -> Dictionary { // CHECK: [[DICT_COPY:%.*]] = copy_value [[DICT]] // CHECK: [[DOWNCAST_FN:%[0-9]+]] = function_ref @$ss19_dictionaryDownCast{{.*}}F // CHECK: apply [[DOWNCAST_FN]]([[DICT_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@guaranteed Dictionary<τ_0_0, τ_0_1>) -> @owned Dictionary<τ_0_2, τ_0_3> // CHECK-NOT: destroy_value [[DICT]] return dict as! Dictionary } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast33testDictionaryDowncastConditional{{.*}}F // CHECK: bb0([[DICT:%[0-9]+]] : @guaranteed $Dictionary) func testDictionaryDowncastConditional(_ dict: Dictionary) -> Dictionary? { // CHECK: [[DICT_COPY:%.*]] = copy_value [[DICT]] // CHECK: [[DOWNCAST_FN:%[0-9]+]] = function_ref @$ss30_dictionaryDownCastConditional{{.*}}F // CHECK: apply [[DOWNCAST_FN]]([[DICT_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@guaranteed Dictionary<τ_0_0, τ_0_1>) -> @owned Optional> // CHECK-NOT: destroy_value [[DICT]] return dict as? Dictionary } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast41testDictionaryDowncastBridgedVConditional{{.*}}F // CHECK: bb0([[DICT:%[0-9]+]] : @guaranteed $Dictionary) func testDictionaryDowncastBridgedVConditional(_ dict: Dictionary) -> Dictionary? { // CHECK: [[DICT_COPY:%.*]] = copy_value [[DICT]] // CHECK: [[BRIDGE_FN:%[0-9]+]] = function_ref @$ss30_dictionaryDownCastConditional{{.*}}F // CHECK: apply [[BRIDGE_FN]]([[DICT_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@guaranteed Dictionary<τ_0_0, τ_0_1>) -> @owned Optional>{{.*}} // CHECK-NOT: destroy_value [[DICT]] return dict as? Dictionary } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast41testDictionaryDowncastBridgedKConditional{{.*}}F // CHECK: bb0([[DICT:%[0-9]+]] : @guaranteed $Dictionary) func testDictionaryDowncastBridgedKConditional(_ dict: Dictionary) -> Dictionary? { // CHECK: [[DICT_COPY:%.*]] = copy_value [[DICT]] // CHECK: [[BRIDGE_FN:%[0-9]+]] = function_ref @$ss30_dictionaryDownCastConditional{{.*}}F // CHECK: apply [[BRIDGE_FN]]([[DICT_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@guaranteed Dictionary<τ_0_0, τ_0_1>) -> @owned Optional> // CHECK-NOT: destroy_value [[DICT]] return dict as? Dictionary } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast31testDictionaryDowncastBridgedKV{{.*}}F // CHECK: bb0([[DICT:%[0-9]+]] : @guaranteed $Dictionary) func testDictionaryDowncastBridgedKV(_ dict: Dictionary) -> Dictionary { // CHECK: [[DICT_COPY:%.*]] = copy_value [[DICT]] // CHECK: [[BRIDGE_FN:%[0-9]+]] = function_ref @$ss19_dictionaryDownCast{{.*}}F // CHECK: apply [[BRIDGE_FN]]([[DICT_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@guaranteed Dictionary<τ_0_0, τ_0_1>) -> @owned Dictionary<τ_0_2, τ_0_3> // CHECK-NOT: destroy_value [[DICT]] return dict as! Dictionary } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast42testDictionaryDowncastBridgedKVConditional{{.*}}F // CHECK: bb0([[DICT:%[0-9]+]] : @guaranteed $Dictionary) func testDictionaryDowncastBridgedKVConditional(_ dict: Dictionary) -> Dictionary? { // CHECK: [[DICT_COPY:%.*]] = copy_value [[DICT]] // CHECK: [[BRIDGE_FN:%[0-9]+]] = function_ref @$ss30_dictionaryDownCastConditional{{.*}}F // CHECK: apply [[BRIDGE_FN]]([[DICT_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@guaranteed Dictionary<τ_0_0, τ_0_1>) -> @owned Optional> // CHECK-NOT: destroy_value [[DICT]] return dict as? Dictionary } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast25testSetDowncastFromObject{{.*}}F // CHECK: bb0([[OBJ:%[0-9]+]] : @guaranteed $AnyObject): func testSetDowncastFromObject(_ obj: AnyObject) -> Set { // CHECK: unconditional_checked_cast_addr AnyObject in [[OBJECT_ALLOC:%[0-9]+]] : $*AnyObject to Set in [[VALUE_ALLOC:%[0-9]+]] : $*Set return obj as! Set } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast15testSetDowncast{{.*}}F // CHECK: bb0([[SET:%[0-9]+]] : @guaranteed $Set) func testSetDowncast(_ dict: Set) -> Set { // CHECK: [[SET_COPY:%.*]] = copy_value [[SET]] // CHECK: [[DOWNCAST_FN:%[0-9]+]] = function_ref @$ss12_setDownCast{{.*}}F // CHECK: apply [[DOWNCAST_FN]]([[SET_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@guaranteed Set<τ_0_0>) -> @owned Set<τ_0_1> // CHECK-NOT: destroy_value [[SET]] return dict as! Set } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast26testSetDowncastConditional{{.*}}F // CHECK: bb0([[SET:%[0-9]+]] : @guaranteed $Set) func testSetDowncastConditional(_ dict: Set) -> Set? { // CHECK: [[SET_COPY:%.*]] = copy_value [[SET]] // CHECK: [[DOWNCAST_FN:%[0-9]+]] = function_ref @$ss23_setDownCastConditional{{.*}}F // CHECK: apply [[DOWNCAST_FN]]([[SET_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@guaranteed Set<τ_0_0>) -> @owned Optional> // CHECK-NOT: destroy_value [[SET]] return dict as? Set } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast22testSetDowncastBridged{{.*}}F // CHECK: bb0([[SET:%[0-9]+]] : @guaranteed $Set) func testSetDowncastBridged(_ dict: Set) -> Set { // CHECK: [[SET_COPY:%.*]] = copy_value [[SET]] // CHECK: [[DOWNCAST_FN:%[0-9]+]] = function_ref @$ss12_setDownCast{{.*}}F // CHECK: apply [[DOWNCAST_FN]]([[SET_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@guaranteed Set<τ_0_0>) -> @owned Set<τ_0_1> // CHECK-NOT: destroy_value [[SET]] return dict as! Set } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast33testSetDowncastBridgedConditional{{.*}}F // CHECK: bb0([[SET:%[0-9]+]] : @guaranteed $Set) func testSetDowncastBridgedConditional(_ dict: Set) -> Set? { // CHECK: [[SET_COPY:%.*]] = copy_value [[SET]] // CHECK: [[DOWNCAST_FN:%[0-9]+]] = function_ref @$ss23_setDownCastConditional{{.*}}F // CHECK: apply [[DOWNCAST_FN]]([[SET_COPY]]) : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@guaranteed Set<τ_0_0>) -> @owned Optional> // CHECK-NOT: destroy_value [[SET]] return dict as? Set } func promote(_ x: T) -> T? { nil } // CHECK-LABEL: sil hidden [ossa] @$s19collection_downcast36testCollectionCompatibilityCoercionsyySaySiG_SayypGSgShySSGSDySSSiGtF func testCollectionCompatibilityCoercions(_ arr: [Int], _ optArr: [Any]?, _ set: Set, _ dict: [String: Int]) { // Make sure we generate reasonable code for all of the below examples. // CHECK: [[CAST_FN:%.+]] = function_ref @$ss15_arrayForceCastySayq_GSayxGr0_lF : $@convention(thin) <τ_0_0, τ_0_1> (@guaranteed Array<τ_0_0>) -> @owned Array<τ_0_1> // CHECK: apply [[CAST_FN]]({{%.+}}) : $@convention(thin) <τ_0_0, τ_0_1> (@guaranteed Array<τ_0_0>) -> @owned Array<τ_0_1> _ = (optArr ?? []) as [NSObject] // CHECK: [[CAST_FN:%.+]] = function_ref @$ss15_arrayForceCastySayq_GSayxGr0_lF : $@convention(thin) <τ_0_0, τ_0_1> (@guaranteed Array<τ_0_0>) -> @owned Array<τ_0_1> // CHECK: [[RESULT:%.+]] = apply [[CAST_FN]]>({{%.+}}) : $@convention(thin) <τ_0_0, τ_0_1> (@guaranteed Array<τ_0_0>) -> @owned Array<τ_0_1> // CHECK: enum $Optional>>, #Optional.some!enumelt, [[RESULT]] : $Array> _ = (optArr ?? []) as [String?]? // CHECK: switch_enum {{%.+}} : $Optional>>> // CHECK: switch_enum {{%.+}} : $Optional>> // CHECK: switch_enum {{%.+}} : $Optional> // CHECK: bb{{[0-9]+}}([[ARR:%.+]] : @owned $Array) // CHECK: [[CAST_FN:%.+]] = function_ref @$ss15_arrayForceCastySayq_GSayxGr0_lF : $@convention(thin) <τ_0_0, τ_0_1> (@guaranteed Array<τ_0_0>) -> @owned Array<τ_0_1> // CHECK: apply [[CAST_FN]]>([[ARR]]) : $@convention(thin) <τ_0_0, τ_0_1> (@guaranteed Array<τ_0_0>) -> @owned Array<τ_0_1> _ = promote(promote(promote(arr))) as [Float?] // CHECK: [[CAST_FN:%.+]] = function_ref @$ss10_setUpCastyShyq_GShyxGSHRzSHR_r0_lF : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@guaranteed Set<τ_0_0>) -> @owned Set<τ_0_1> // CHECK: apply [[CAST_FN]]({{%.+}}) : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@guaranteed Set<τ_0_0>) -> @owned Set<τ_0_1> _ = (set ?? []) as Set // CHECK: [[CAST_FN:%.+]] = function_ref @$ss10_setUpCastyShyq_GShyxGSHRzSHR_r0_lF : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@guaranteed Set<τ_0_0>) -> @owned Set<τ_0_1> // CHECK: [[RESULT:%.+]] = apply [[CAST_FN]]>({{%.+}}) : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@guaranteed Set<τ_0_0>) -> @owned Set<τ_0_1> // CHECK: [[OPT_RESULT:%.+]] = enum $Optional>>, #Optional.some!enumelt, [[RESULT]] : $Set> // CHECK: enum $Optional>>>, #Optional.some!enumelt, [[OPT_RESULT]] : $Optional>> _ = (set ?? []) as Set?? // CHECK: switch_enum {{%.+}} : $Optional>>> // CHECK: switch_enum {{%.+}} : $Optional>> // CHECK: switch_enum {{%.+}} : $Optional> // CHECK: bb{{[0-9]+}}([[SET:%.+]] : @owned $Set) // CHECK: [[CAST_FN:%.+]] = function_ref @$ss10_setUpCastyShyq_GShyxGSHRzSHR_r0_lF : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@guaranteed Set<τ_0_0>) -> @owned Set<τ_0_1> // CHECK: apply [[CAST_FN]]([[SET]]) : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@guaranteed Set<τ_0_0>) -> @owned Set<τ_0_1> _ = promote(promote(promote(set))) as Set // CHECK: [[CAST_FN:%.+]] = function_ref @$ss17_dictionaryUpCastySDyq0_q1_GSDyxq_GSHRzSHR0_r2_lF : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@guaranteed Dictionary<τ_0_0, τ_0_1>) -> @owned Dictionary<τ_0_2, τ_0_3> // CHECK: apply [[CAST_FN]]({{%.+}}) : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@guaranteed Dictionary<τ_0_0, τ_0_1>) -> @owned Dictionary<τ_0_2, τ_0_3> _ = (dict ?? [:]) as [Float: String] // CHECK: [[CAST_FN:%.+]] = function_ref @$ss17_dictionaryUpCastySDyq0_q1_GSDyxq_GSHRzSHR0_r2_lF : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@guaranteed Dictionary<τ_0_0, τ_0_1>) -> @owned Dictionary<τ_0_2, τ_0_3> // CHECK: [[RESULT:%.+]] = apply [[CAST_FN]]>({{%.+}}) : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@guaranteed Dictionary<τ_0_0, τ_0_1>) -> @owned Dictionary<τ_0_2, τ_0_3> // CHECK: enum $Optional>>, #Optional.some!enumelt, [[RESULT]] : $Dictionary> _ = (dict ?? [:]) as [Double: Int?]? // CHECK: switch_enum {{%.+}} : $Optional>>> // CHECK: switch_enum {{%.+}} : $Optional>> // CHECK: switch_enum {{%.+}} : $Optional> // CHECK: bb{{[0-9]+}}([[DICT:%.+]] : @owned $Dictionary) // CHECK: [[CAST_FN:%.+]] = function_ref @$ss17_dictionaryUpCastySDyq0_q1_GSDyxq_GSHRzSHR0_r2_lF : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@guaranteed Dictionary<τ_0_0, τ_0_1>) -> @owned Dictionary<τ_0_2, τ_0_3> // CHECK: apply [[CAST_FN]]([[DICT]]) : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@guaranteed Dictionary<τ_0_0, τ_0_1>) -> @owned Dictionary<τ_0_2, τ_0_3> _ = promote(promote(promote(dict))) as [Int: String] }