mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
948 lines
36 KiB
Swift
948 lines
36 KiB
Swift
// RUN: %target-swift-frontend -O -emit-sil -enforce-exclusivity=unchecked %s | %FileCheck %s
|
|
// RUN: %target-swift-frontend -enable-ownership-stripping-after-serialization -O -emit-sil -enforce-exclusivity=unchecked %s | %FileCheck %s
|
|
|
|
// REQUIRES: objc_interop
|
|
|
|
// Check that casts between bridged types are replaced by more
|
|
// efficient code sequences.
|
|
//
|
|
// In particular, checked_cast_* and unconditional_checked_* instructions,
|
|
// which are pretty expensive at run-time (e.g. because they use
|
|
// runtime _dynamicCast calls and check conformances at run-time),
|
|
// should be replaced by invocations of specialized bridging functions,
|
|
// which make use of statically known compile-time conformances and
|
|
// do not perform any conformance checks at run-time.
|
|
|
|
import Foundation
|
|
|
|
public func forcedCast<NS, T>(_ ns: NS) -> T {
|
|
return ns as! T
|
|
}
|
|
|
|
public func condCast<NS, T>(_ ns: NS) -> T? {
|
|
return ns as? T
|
|
}
|
|
|
|
// Check optimizations of casts from NSString to String
|
|
|
|
var nsString: NSString = "string"
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding29testForcedCastNStoSwiftStringSSyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSS10FoundationE26_forceBridgeFromObjectiveC_6resultySo8NSStringC_SSSgztFZ : $@convention(method) (@guaranteed NSString, @inout Optional<String>, @thin String.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNStoSwiftString() -> String {
|
|
var o: String = forcedCast(nsString)
|
|
return o
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding27testCondCastNStoSwiftStringSSSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSS10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo8NSStringC_SSSgztFZ : $@convention(method) (@guaranteed NSString, @inout Optional<String>, @thin String.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNStoSwiftString() -> String? {
|
|
var o: String? = condCast(nsString)
|
|
return o
|
|
}
|
|
|
|
|
|
// Check optimizations of casts from NSNumber to Int
|
|
|
|
var nsIntNumber = NSNumber(value: 1)
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding32testForcedCastNSNumberToSwiftIntSiyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSi10FoundationE26_forceBridgeFromObjectiveC_6resultySo8NSNumberC_SiSgztFZ : $@convention(method) (@guaranteed NSNumber, @inout Optional<Int>, @thin Int.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNSNumberToSwiftInt() -> Int {
|
|
var o: Int = forcedCast(nsIntNumber)
|
|
return o
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding30testCondCastNSNumberToSwiftIntSiSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSi10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo8NSNumberC_SiSgztFZ : $@convention(method) (@guaranteed NSNumber, @inout Optional<Int>, @thin Int.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNSNumberToSwiftInt() -> Int? {
|
|
var o: Int? = condCast(nsIntNumber)
|
|
return o
|
|
}
|
|
|
|
// Check optimizations of casts from NSNumber to Double
|
|
|
|
var nsDoubleNumber = NSNumber(value: 1.234)
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding35testForcedCastNSNumberToSwiftDoubleSdyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSd10FoundationE26_forceBridgeFromObjectiveC_6resultySo8NSNumberC_SdSgztFZ : $@convention(method) (@guaranteed NSNumber, @inout Optional<Double>, @thin Double.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNSNumberToSwiftDouble() -> Double {
|
|
var o: Double = forcedCast(nsDoubleNumber)
|
|
return o
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding33testCondCastNSNumberToSwiftDoubleSdSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSd10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo8NSNumberC_SdSgztFZ : $@convention(method) (@guaranteed NSNumber, @inout Optional<Double>, @thin Double.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNSNumberToSwiftDouble() -> Double? {
|
|
var o: Double? = condCast(nsDoubleNumber)
|
|
return o
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding38testForcedCastNSIntNumberToSwiftDoubleSdyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSd10FoundationE26_forceBridgeFromObjectiveC_6resultySo8NSNumberC_SdSgztFZ : $@convention(method) (@guaranteed NSNumber, @inout Optional<Double>, @thin Double.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNSIntNumberToSwiftDouble() -> Double {
|
|
var o: Double = forcedCast(nsIntNumber)
|
|
return o
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding36testCondCastNSIntNumberToSwiftDoubleSdSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSd10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo8NSNumberC_SdSgztFZ : $@convention(method) (@guaranteed NSNumber, @inout Optional<Double>, @thin Double.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNSIntNumberToSwiftDouble() -> Double? {
|
|
var o: Double? = condCast(nsIntNumber)
|
|
return o
|
|
}
|
|
|
|
|
|
|
|
// Check optimization of casts from NSArray to Swift Array
|
|
|
|
var nsArrInt: NSArray = [1, 2, 3, 4]
|
|
var nsArrDouble: NSArray = [1.1, 2.2, 3.3, 4.4]
|
|
var nsArrString: NSArray = ["One", "Two", "Three", "Four"]
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding31testForcedCastNStoSwiftArrayIntSaySiGyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSa10FoundationE26_forceBridgeFromObjectiveC_6resultySo7NSArrayC_SayxGSgztFZ : $@convention(method) <τ_0_0> (@guaranteed NSArray, @inout Optional<Array<τ_0_0>>, @thin Array<τ_0_0>.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNStoSwiftArrayInt() -> [Int] {
|
|
var arr: [Int] = forcedCast(nsArrInt)
|
|
return arr
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding29testCondCastNStoSwiftArrayIntSaySiGSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSa10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo7NSArrayC_SayxGSgztFZ : $@convention(method) <τ_0_0> (@guaranteed NSArray, @inout Optional<Array<τ_0_0>>, @thin Array<τ_0_0>.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNStoSwiftArrayInt() -> [Int]? {
|
|
var arrOpt: [Int]? = condCast(nsArrInt)
|
|
return arrOpt
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding34testForcedCastNStoSwiftArrayDoubleSaySdGyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSa10FoundationE26_forceBridgeFromObjectiveC_6resultySo7NSArrayC_SayxGSgztFZ : $@convention(method) <τ_0_0> (@guaranteed NSArray, @inout Optional<Array<τ_0_0>>, @thin Array<τ_0_0>.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNStoSwiftArrayDouble() -> [Double] {
|
|
var arr: [Double] = forcedCast(nsArrDouble)
|
|
return arr
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding32testCondCastNStoSwiftArrayDoubleSaySdGSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSa10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo7NSArrayC_SayxGSgztFZ : $@convention(method) <τ_0_0> (@guaranteed NSArray, @inout Optional<Array<τ_0_0>>, @thin Array<τ_0_0>.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNStoSwiftArrayDouble() -> [Double]? {
|
|
var arrOpt: [Double]? = condCast(nsArrDouble)
|
|
return arrOpt
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding34testForcedCastNStoSwiftArrayStringSaySSGyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSa10FoundationE26_forceBridgeFromObjectiveC_6resultySo7NSArrayC_SayxGSgztFZ : $@convention(method) <τ_0_0> (@guaranteed NSArray, @inout Optional<Array<τ_0_0>>, @thin Array<τ_0_0>.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNStoSwiftArrayString() -> [String] {
|
|
var arr: [String] = forcedCast(nsArrString)
|
|
return arr
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding32testCondCastNStoSwiftArrayStringSaySSGSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSa10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo7NSArrayC_SayxGSgztFZ : $@convention(method) <τ_0_0> (@guaranteed NSArray, @inout Optional<Array<τ_0_0>>, @thin Array<τ_0_0>.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNStoSwiftArrayString() -> [String]? {
|
|
var arrOpt: [String]? = condCast(nsArrString)
|
|
return arrOpt
|
|
}
|
|
|
|
|
|
|
|
// Check optimization of casts from NSDictionary to Swift Dictionary
|
|
|
|
var nsDictInt: NSDictionary = [1:1, 2:2, 3:3, 4:4]
|
|
var nsDictDouble: NSDictionary = [1.1 : 1.1, 2.2 : 2.2, 3.3 : 3.3, 4.4 : 4.4]
|
|
var nsDictString: NSDictionary = ["One":"One", "Two":"Two", "Three":"Three", "Four":"Four"]
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding30testForcedCastNStoSwiftDictIntSDyS2iGyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSD10FoundationE26_forceBridgeFromObjectiveC_6resultySo12NSDictionaryC_SDyxq_GSgztFZ : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@guaranteed NSDictionary, @inout Optional<Dictionary<τ_0_0, τ_0_1>>, @thin Dictionary<τ_0_0, τ_0_1>.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNStoSwiftDictInt() -> [Int: Int] {
|
|
var dict: [Int: Int] = forcedCast(nsDictInt)
|
|
return dict
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding28testCondCastNStoSwiftDictIntSDyS2iGSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSD10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo12NSDictionaryC_SDyxq_GSgztFZ : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@guaranteed NSDictionary, @inout Optional<Dictionary<τ_0_0, τ_0_1>>, @thin Dictionary<τ_0_0, τ_0_1>.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNStoSwiftDictInt() -> [Int: Int]? {
|
|
var dictOpt: [Int: Int]? = condCast(nsDictInt)
|
|
return dictOpt
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding33testForcedCastNStoSwiftDictDoubleSDyS2dGyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSD10FoundationE26_forceBridgeFromObjectiveC_6resultySo12NSDictionaryC_SDyxq_GSgztFZ : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@guaranteed NSDictionary, @inout Optional<Dictionary<τ_0_0, τ_0_1>>, @thin Dictionary<τ_0_0, τ_0_1>.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNStoSwiftDictDouble() -> [Double: Double] {
|
|
var dict: [Double: Double] = forcedCast(nsDictDouble)
|
|
return dict
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding31testCondCastNStoSwiftDictDoubleSDyS2dGSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSD10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo12NSDictionaryC_SDyxq_GSgztFZ : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@guaranteed NSDictionary, @inout Optional<Dictionary<τ_0_0, τ_0_1>>, @thin Dictionary<τ_0_0, τ_0_1>.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNStoSwiftDictDouble() -> [Double: Double]? {
|
|
var dictOpt: [Double: Double]? = condCast(nsDictDouble)
|
|
return dictOpt
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding33testForcedCastNStoSwiftDictStringSDyS2SGyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSD10FoundationE26_forceBridgeFromObjectiveC_6resultySo12NSDictionaryC_SDyxq_GSgztFZ : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@guaranteed NSDictionary, @inout Optional<Dictionary<τ_0_0, τ_0_1>>, @thin Dictionary<τ_0_0, τ_0_1>.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNStoSwiftDictString() -> [String: String] {
|
|
var dict: [String: String] = forcedCast(nsDictString)
|
|
return dict
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding31testCondCastNStoSwiftDictStringSDyS2SGSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSD10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo12NSDictionaryC_SDyxq_GSgztFZ : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@guaranteed NSDictionary, @inout Optional<Dictionary<τ_0_0, τ_0_1>>, @thin Dictionary<τ_0_0, τ_0_1>.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNStoSwiftDictString() -> [String: String]? {
|
|
var dictOpt: [String: String]? = condCast(nsDictString)
|
|
return dictOpt
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding40testForcedCastNSDictStringtoSwiftDictIntSDyS2iGyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSD10FoundationE26_forceBridgeFromObjectiveC_6resultySo12NSDictionaryC_SDyxq_GSgztFZ : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@guaranteed NSDictionary, @inout Optional<Dictionary<τ_0_0, τ_0_1>>, @thin Dictionary<τ_0_0, τ_0_1>.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNSDictStringtoSwiftDictInt() -> [Int: Int] {
|
|
var dictOpt: [Int: Int] = forcedCast(nsDictString)
|
|
return dictOpt
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding38testCondCastNSDictStringtoSwiftDictIntSDyS2iGSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSD10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo12NSDictionaryC_SDyxq_GSgztFZ : $@convention(method) <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@guaranteed NSDictionary, @inout Optional<Dictionary<τ_0_0, τ_0_1>>, @thin Dictionary<τ_0_0, τ_0_1>.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNSDictStringtoSwiftDictInt() -> [Int: Int]? {
|
|
var dictOpt: [Int: Int]? = condCast(nsDictString)
|
|
return dictOpt
|
|
}
|
|
|
|
|
|
// Check optimization of casts from NSSet to Swift Set
|
|
|
|
var nsSetInt: NSSet = [1, 2, 3, 4]
|
|
var nsSetDouble: NSSet = [1.1, 2.2, 3.3, 4.4]
|
|
var nsSetString: NSSet = ["One", "Two", "Three", "Four"]
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding29testForcedCastNStoSwiftSetIntShySiGyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSh10FoundationE26_forceBridgeFromObjectiveC_6resultySo5NSSetC_ShyxGSgztFZ : $@convention(method) <τ_0_0 where τ_0_0 : Hashable> (@guaranteed NSSet, @inout Optional<Set<τ_0_0>>, @thin Set<τ_0_0>.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNStoSwiftSetInt() -> Set<Int> {
|
|
var set: Set<Int> = forcedCast(nsSetInt)
|
|
return set
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding27testCondCastNStoSwiftSetIntShySiGSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSh10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo5NSSetC_ShyxGSgztFZ : $@convention(method) <τ_0_0 where τ_0_0 : Hashable> (@guaranteed NSSet, @inout Optional<Set<τ_0_0>>, @thin Set<τ_0_0>.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNStoSwiftSetInt() -> Set<Int>? {
|
|
var setOpt: Set<Int>? = condCast(nsSetInt)
|
|
return setOpt
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding32testForcedCastNStoSwiftSetDoubleShySdGyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSh10FoundationE26_forceBridgeFromObjectiveC_6resultySo5NSSetC_ShyxGSgztFZ : $@convention(method) <τ_0_0 where τ_0_0 : Hashable> (@guaranteed NSSet, @inout Optional<Set<τ_0_0>>, @thin Set<τ_0_0>.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNStoSwiftSetDouble() -> Set<Double> {
|
|
var set: Set<Double> = forcedCast(nsSetDouble)
|
|
return set
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding30testCondCastNStoSwiftSetDoubleShySdGSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSh10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo5NSSetC_ShyxGSgztFZ : $@convention(method) <τ_0_0 where τ_0_0 : Hashable> (@guaranteed NSSet, @inout Optional<Set<τ_0_0>>, @thin Set<τ_0_0>.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNStoSwiftSetDouble() -> Set<Double>? {
|
|
var setOpt: Set<Double>? = condCast(nsSetDouble)
|
|
return setOpt
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding32testForcedCastNStoSwiftSetStringShySSGyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @$sSh10FoundationE26_forceBridgeFromObjectiveC_6resultySo5NSSetC_ShyxGSgztFZ : $@convention(method) <τ_0_0 where τ_0_0 : Hashable> (@guaranteed NSSet, @inout Optional<Set<τ_0_0>>, @thin Set<τ_0_0>.Type) -> ()
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastNStoSwiftSetString() -> Set<String> {
|
|
var set: Set<String> = forcedCast(nsSetString)
|
|
return set
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding30testCondCastNStoSwiftSetStringShySSGSgyF
|
|
// CHECK-NOT: checked_cast
|
|
// CHECK: function_ref @$sSh10FoundationE34_conditionallyBridgeFromObjectiveC_6resultSbSo5NSSetC_ShyxGSgztFZ : $@convention(method) <τ_0_0 where τ_0_0 : Hashable> (@guaranteed NSSet, @inout Optional<Set<τ_0_0>>, @thin Set<τ_0_0>.Type) -> Bool
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastNStoSwiftSetString() -> Set<String>? {
|
|
var setOpt: Set<String>? = condCast(nsSetString)
|
|
return setOpt
|
|
}
|
|
|
|
|
|
// Check optimizations of casts from String to NSString
|
|
|
|
var swiftString: String = "string"
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding29testForcedCastSwiftToNSStringSo0I0CyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastSwiftToNSString() -> NSString {
|
|
var o: NSString = forcedCast(swiftString)
|
|
return o
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding27testCondCastSwiftToNSStringSo0I0CSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastSwiftToNSString() -> NSString? {
|
|
var o: NSString? = condCast(swiftString)
|
|
return o
|
|
}
|
|
|
|
|
|
// Check optimizations of casts from Int to NSNumber
|
|
|
|
var swiftIntNumber: Int = 1
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding32testForcedCastSwiftIntToNSNumberSo0J0CyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastSwiftIntToNSNumber() -> NSNumber {
|
|
var o: NSNumber = forcedCast(swiftIntNumber)
|
|
return o
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding30testCondCastSwiftIntToNSNumberSo0J0CSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastSwiftIntToNSNumber() -> NSNumber? {
|
|
var o: NSNumber? = condCast(swiftIntNumber)
|
|
return o
|
|
}
|
|
|
|
// Check optimizations of casts from Double to NSNumber
|
|
|
|
var swiftDoubleNumber: Double = 1.234
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding35testForcedCastSwiftDoubleToNSNumberSo0J0CyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastSwiftDoubleToNSNumber() -> NSNumber {
|
|
var o: NSNumber = forcedCast(swiftDoubleNumber)
|
|
return o
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding33testCondCastSwiftDoubleToNSNumberSo0J0CSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastSwiftDoubleToNSNumber() -> NSNumber? {
|
|
var o: NSNumber? = condCast(swiftDoubleNumber)
|
|
return o
|
|
}
|
|
|
|
|
|
// Check optimization of casts from Swift Array to NSArray
|
|
|
|
var arrInt: [Int] = [1, 2, 3, 4]
|
|
var arrDouble: [Double] = [1.1, 2.2, 3.3, 4.4]
|
|
var arrString: [String] = ["One", "Two", "Three", "Four"]
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding31testForcedCastSwiftToNSArrayIntSo0I0CyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastSwiftToNSArrayInt() -> NSArray {
|
|
var arr: NSArray = forcedCast(arrInt)
|
|
return arr
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding29testCondCastSwiftToNSArrayIntSo0I0CSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastSwiftToNSArrayInt() -> NSArray? {
|
|
var arrOpt: NSArray? = condCast(arrInt)
|
|
return arrOpt
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding34testForcedCastSwiftToNSArrayDoubleSo0I0CyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastSwiftToNSArrayDouble() -> NSArray {
|
|
var arr: NSArray = forcedCast(arrDouble)
|
|
return arr
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding32testCondCastSwiftToNSArrayDoubleSo0I0CSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastSwiftToNSArrayDouble() -> NSArray? {
|
|
var arrOpt: NSArray? = condCast(arrDouble)
|
|
return arrOpt
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding34testForcedCastSwiftToNSArrayStringSo0I0CyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastSwiftToNSArrayString() -> NSArray {
|
|
var arr: NSArray = forcedCast(arrString)
|
|
return arr
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding32testCondCastSwiftToNSArrayStringSo0I0CSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastSwiftToNSArrayString() -> NSArray? {
|
|
var arrOpt: NSArray? = condCast(arrString)
|
|
return arrOpt
|
|
}
|
|
|
|
|
|
// Check optimization of casts from Swift Dict to NSDict
|
|
|
|
var dictInt: [Int: Int] = [1:1, 2:2, 3:3, 4:4]
|
|
var dictDouble: [Double: Double] = [1.1 : 1.1, 2.2 : 2.2, 3.3 : 3.3, 4.4 : 4.4]
|
|
var dictString: [String: String] = ["One":"One", "Two":"Two", "Three":"Three", "Four":"Four"]
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding30testForcedCastSwiftToNSDictIntSo12NSDictionaryCyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastSwiftToNSDictInt() -> NSDictionary {
|
|
var dict: NSDictionary = forcedCast(dictInt)
|
|
return dict
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding28testCondCastSwiftToNSDictIntSo12NSDictionaryCSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastSwiftToNSDictInt() -> NSDictionary? {
|
|
var dictOpt: NSDictionary? = condCast(dictInt)
|
|
return dictOpt
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding33testForcedCastSwiftToNSDictDoubleSo12NSDictionaryCyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastSwiftToNSDictDouble() -> NSDictionary {
|
|
var dict: NSDictionary = forcedCast(dictDouble)
|
|
return dict
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding31testCondCastSwiftToNSDictDoubleSo12NSDictionaryCSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastSwiftToNSDictDouble() -> NSDictionary? {
|
|
var dictOpt: NSDictionary? = condCast(dictDouble)
|
|
return dictOpt
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding33testForcedCastSwiftToNSDictStringSo12NSDictionaryCyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastSwiftToNSDictString() -> NSDictionary {
|
|
var dict: NSDictionary = forcedCast(dictString)
|
|
return dict
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding31testCondCastSwiftToNSDictStringSo12NSDictionaryCSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastSwiftToNSDictString() -> NSDictionary? {
|
|
var dictOpt: NSDictionary? = condCast(dictString)
|
|
return dictOpt
|
|
}
|
|
|
|
|
|
// Check optimization of casts from Swift Set to NSSet
|
|
|
|
var setInt: Set<Int> = [1, 2, 3, 4]
|
|
var setDouble: Set<Double> = [1.1, 2.2, 3.3, 4.4]
|
|
var setString: Set<String> = ["One", "Two", "Three", "Four"]
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding29testForcedCastSwiftToNSSetIntSo0I0CyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastSwiftToNSSetInt() -> NSSet {
|
|
var set: NSSet = forcedCast(setInt)
|
|
return set
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding27testCondCastSwiftToNSSetIntSo0I0CSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastSwiftToNSSetInt() -> NSSet? {
|
|
var setOpt: NSSet? = condCast(setInt)
|
|
return setOpt
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding32testForcedCastSwiftToNSSetDoubleSo0I0CyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastSwiftToNSSetDouble() -> NSSet {
|
|
var set: NSSet = forcedCast(setDouble)
|
|
return set
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding30testCondCastSwiftToNSSetDoubleSo0I0CSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastSwiftToNSSetDouble() -> NSSet? {
|
|
var setOpt: NSSet? = condCast(setDouble)
|
|
return setOpt
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding32testForcedCastSwiftToNSSetStringSo0I0CyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastSwiftToNSSetString() -> NSSet {
|
|
var set: NSSet = forcedCast(setString)
|
|
return set
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding30testCondCastSwiftToNSSetStringSo0I0CSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastSwiftToNSSetString() -> NSSet? {
|
|
var setOpt: NSSet? = condCast(setString)
|
|
return setOpt
|
|
}
|
|
|
|
// Casts involving generics cannot be optimized.
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding25testForcedCastFromGeneric{{[_0-9a-zA-Z]*}}F
|
|
// CHECK: unconditional_checked
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastFromGeneric<T>(_ x: T) -> NSString {
|
|
var set: NSString = x as! NSString
|
|
return set
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding23testForcedCastToGeneric{{[_0-9a-zA-Z]*}}F
|
|
// CHECK: unconditional_checked
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testForcedCastToGeneric<T>(_ x: T) -> T {
|
|
var set: T = nsString as! T
|
|
return set
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding23testCondCastFromGeneric{{[_0-9a-zA-Z]*}}F
|
|
// CHECK: checked_cast_addr_br
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastFromGeneric<T>(_ x: T) -> NSString? {
|
|
var setOpt: NSString? = x as? NSString
|
|
return setOpt
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding21testCondCastToGeneric{{[_0-9a-zA-Z]*}}F
|
|
// CHECK: checked_cast_addr_br
|
|
// CHECK: return
|
|
@inline(never)
|
|
public func testCondCastToGeneric<T>(_ x: T) -> T? {
|
|
var setOpt: T? = nsString as? T
|
|
return setOpt
|
|
}
|
|
|
|
|
|
// Run-time tests
|
|
|
|
//// ObjC -> Swift
|
|
|
|
// Arrays
|
|
print("NS to Swift arrays: Start")
|
|
print(testForcedCastNStoSwiftArrayInt())
|
|
print(testCondCastNStoSwiftArrayInt())
|
|
|
|
print(testForcedCastNStoSwiftArrayDouble())
|
|
print(testCondCastNStoSwiftArrayDouble())
|
|
|
|
print(testForcedCastNStoSwiftArrayString())
|
|
print(testCondCastNStoSwiftArrayString())
|
|
print("NS to Swift arrays: End")
|
|
|
|
// Dicts
|
|
print("NS to Swift dictionaries: Start")
|
|
print(testForcedCastNStoSwiftDictInt())
|
|
print(testCondCastNStoSwiftDictInt())
|
|
|
|
print(testForcedCastNStoSwiftDictDouble())
|
|
print(testCondCastNStoSwiftDictDouble())
|
|
|
|
print(testForcedCastNStoSwiftDictString())
|
|
print(testCondCastNStoSwiftDictString())
|
|
print(testCondCastNSDictStringtoSwiftDictInt())
|
|
// This line should crash at run-time
|
|
//print(testForcedCastNSDictStringtoSwiftDictInt())
|
|
print("NS to Swift dictionaries: End")
|
|
|
|
// Sets
|
|
print("NS to Swift sets: Start")
|
|
print(testForcedCastNStoSwiftSetInt())
|
|
print(testCondCastNStoSwiftSetInt())
|
|
|
|
print(testForcedCastNStoSwiftSetDouble())
|
|
print(testCondCastNStoSwiftSetDouble())
|
|
|
|
print(testForcedCastNStoSwiftSetString())
|
|
print(testCondCastNStoSwiftSetString())
|
|
print("NS to Swift sets: End")
|
|
|
|
|
|
// Basic types
|
|
|
|
print("NS to Swift basic types: Start")
|
|
print(testForcedCastNSNumberToSwiftInt())
|
|
print(testCondCastNSNumberToSwiftInt())
|
|
|
|
print(testForcedCastNSNumberToSwiftDouble())
|
|
print(testCondCastNSNumberToSwiftDouble())
|
|
|
|
print(testForcedCastNSIntNumberToSwiftDouble())
|
|
print(testCondCastNSIntNumberToSwiftDouble())
|
|
|
|
print(testForcedCastNStoSwiftString())
|
|
print(testCondCastNStoSwiftString())
|
|
print("NS to Swift basic types: End")
|
|
|
|
//// Swift -> ObjC
|
|
|
|
// Basic types
|
|
|
|
print("Swift to NS basic types: Start")
|
|
print(testForcedCastSwiftIntToNSNumber())
|
|
print(testCondCastSwiftIntToNSNumber())
|
|
|
|
print(testForcedCastSwiftDoubleToNSNumber())
|
|
print(testCondCastSwiftDoubleToNSNumber())
|
|
|
|
print(testForcedCastSwiftToNSString())
|
|
print(testCondCastSwiftToNSString())
|
|
print("Swift to NS basic types: End")
|
|
|
|
// Arrays
|
|
print("Swift to NS arrays: Start")
|
|
|
|
print(testForcedCastSwiftToNSArrayInt())
|
|
print(testCondCastSwiftToNSArrayInt())
|
|
|
|
print(testForcedCastSwiftToNSArrayDouble())
|
|
print(testCondCastSwiftToNSArrayDouble())
|
|
|
|
print(testForcedCastSwiftToNSArrayString())
|
|
print(testCondCastSwiftToNSArrayString())
|
|
|
|
print("Swift to NS arrays: End")
|
|
|
|
|
|
// Dicts
|
|
print("Swift to NS dictionaries: Start")
|
|
|
|
print(testForcedCastSwiftToNSDictInt())
|
|
print(testCondCastSwiftToNSDictInt())
|
|
|
|
print(testForcedCastSwiftToNSDictDouble())
|
|
print(testCondCastSwiftToNSDictDouble())
|
|
|
|
print(testForcedCastSwiftToNSDictString())
|
|
print(testCondCastSwiftToNSDictString())
|
|
|
|
print("Swift to NS dictionaries: End")
|
|
|
|
// Sets
|
|
print("Swift to NS sets: Start")
|
|
|
|
print(testForcedCastSwiftToNSSetInt())
|
|
print(testCondCastSwiftToNSSetInt())
|
|
|
|
print(testForcedCastSwiftToNSSetDouble())
|
|
print(testCondCastSwiftToNSSetDouble())
|
|
|
|
print(testForcedCastSwiftToNSSetString())
|
|
print(testCondCastSwiftToNSSetString())
|
|
|
|
print("Swift to NS sets: End")
|
|
|
|
// Check optimizations of casts from String to CFString
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding29testForcedCastSwiftToCFStringSo0I3RefayF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: unchecked_ref_cast{{.*}}: $NSString to $CFString
|
|
// CHECK: end{{.*}}$s21bridged_casts_folding29testForcedCastSwiftToCFStringSo0I3RefayF
|
|
@inline(never)
|
|
public func testForcedCastSwiftToCFString() -> CFString {
|
|
let o: CFString = forcedCast(swiftString)
|
|
return o
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding27testCondCastSwiftToCFStringSo0I3RefaSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: unchecked_ref_cast{{.*}}: $NSString to $CFString
|
|
// CHECK: end{{.*}}$s21bridged_casts_folding27testCondCastSwiftToCFStringSo0I3RefaSgyF
|
|
@inline(never)
|
|
public func testCondCastSwiftToCFString() -> CFString? {
|
|
let o: CFString? = condCast(swiftString)
|
|
return o
|
|
}
|
|
|
|
// Check optimizations of casts from Int to CFNumber
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding32testForcedCastSwiftIntToCFNumberSo0J3RefayF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: unchecked_ref_cast{{.*}}: $NSNumber to $CFNumber
|
|
// CHECK: end{{.*}}$s21bridged_casts_folding32testForcedCastSwiftIntToCFNumberSo0J3RefayF
|
|
@inline(never)
|
|
public func testForcedCastSwiftIntToCFNumber() -> CFNumber {
|
|
let o: CFNumber = forcedCast(swiftIntNumber)
|
|
return o
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding30testCondCastSwiftIntToCFNumberSo0J3RefaSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: unchecked_ref_cast{{.*}}: $NSNumber to $CFNumber
|
|
// CHECK: end{{.*}}$s21bridged_casts_folding30testCondCastSwiftIntToCFNumberSo0J3RefaSgyF
|
|
@inline(never)
|
|
public func testCondCastSwiftIntToCFNumber() -> CFNumber? {
|
|
let o: CFNumber? = condCast(swiftIntNumber)
|
|
return o
|
|
}
|
|
|
|
// Check optimization of casts from Swift Array to CFArray
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding31testForcedCastSwiftToCFArrayIntSo0I3RefayF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: unchecked_ref_cast{{.*}}: $NSArray to $CFArray
|
|
// CHECK: end{{.*}}$s21bridged_casts_folding31testForcedCastSwiftToCFArrayIntSo0I3RefayF
|
|
@inline(never)
|
|
public func testForcedCastSwiftToCFArrayInt() -> CFArray {
|
|
let arr: CFArray = forcedCast(arrInt)
|
|
return arr
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding29testCondCastSwiftToCFArrayIntSo0I3RefaSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: unchecked_ref_cast{{.*}}: $NSArray to $CFArray
|
|
// CHECK: end{{.*}}$s21bridged_casts_folding29testCondCastSwiftToCFArrayIntSo0I3RefaSgyF
|
|
@inline(never)
|
|
public func testCondCastSwiftToCFArrayInt() -> CFArray? {
|
|
let arrOpt: CFArray? = condCast(arrInt)
|
|
return arrOpt
|
|
}
|
|
|
|
// Check optimization of casts from Swift Dict to CFDictionary
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding30testForcedCastSwiftToCFDictIntSo15CFDictionaryRefayF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: unchecked_ref_cast{{.*}}: $NSDictionary to $CFDictionary
|
|
// CHECK: end{{.*}}$s21bridged_casts_folding30testForcedCastSwiftToCFDictIntSo15CFDictionaryRefayF
|
|
@inline(never)
|
|
public func testForcedCastSwiftToCFDictInt() -> CFDictionary {
|
|
let dict: CFDictionary = forcedCast(dictInt)
|
|
return dict
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding28testCondCastSwiftToCFDictIntSo15CFDictionaryRefaSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: unchecked_ref_cast{{.*}}: $NSDictionary to $CFDictionary
|
|
// CHECK: end{{.*}}$s21bridged_casts_folding28testCondCastSwiftToCFDictIntSo15CFDictionaryRefaSgyF
|
|
@inline(never)
|
|
public func testCondCastSwiftToCFDictInt() -> CFDictionary? {
|
|
let dictOpt: CFDictionary? = condCast(dictInt)
|
|
return dictOpt
|
|
}
|
|
|
|
// Check optimization of casts from Swift Set to CFSet
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding29testForcedCastSwiftToCFSetIntSo0I3RefayF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: unchecked_ref_cast{{.*}}: $NSSet to $CFSet
|
|
// CHECK: end{{.*}}$s21bridged_casts_folding29testForcedCastSwiftToCFSetIntSo0I3RefayF
|
|
@inline(never)
|
|
public func testForcedCastSwiftToCFSetInt() -> CFSet {
|
|
let set: CFSet = forcedCast(setInt)
|
|
return set
|
|
}
|
|
|
|
// CHECK-LABEL: sil [noinline] @$s21bridged_casts_folding27testCondCastSwiftToCFSetIntSo0I3RefaSgyF
|
|
// CHECK-NOT: unconditional_checked
|
|
// CHECK: function_ref @{{.*}}_bridgeToObjectiveC
|
|
// CHECK: unchecked_ref_cast{{.*}}: $NSSet to $CFSet
|
|
// CHECK: end{{.*}}$s21bridged_casts_folding27testCondCastSwiftToCFSetIntSo0I3RefaSgyF
|
|
@inline(never)
|
|
public func testCondCastSwiftToCFSetInt() -> CFSet? {
|
|
let setOpt: CFSet? = condCast(setInt)
|
|
return setOpt
|
|
}
|
|
|
|
public class NSObjectSubclass : NSObject { }
|
|
|
|
var anyHashable: AnyHashable = 0
|
|
|
|
// CHECK-LABEL: $s21bridged_casts_folding29testUncondCastSwiftToSubclassAA08NSObjectI0CyF
|
|
// CHECK: [[GLOBAL:%[0-9]+]] = global_addr @$s21bridged_casts_folding11anyHashables03AnyE0Vv
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$ss11AnyHashableV10FoundationE19_bridgeToObjectiveCSo8NSObjectCyF
|
|
// CHECK-NEXT: apply [[FUNC]]([[GLOBAL]])
|
|
// CHECK-NEXT: unconditional_checked_cast {{%.*}} : $NSObject to $NSObjectSubclass
|
|
// CHECK: } // end sil function '$s21bridged_casts_folding29testUncondCastSwiftToSubclassAA08NSObjectI0CyF'
|
|
@inline(never)
|
|
public func testUncondCastSwiftToSubclass() -> NSObjectSubclass {
|
|
return anyHashable as! NSObjectSubclass
|
|
}
|
|
|
|
class MyThing: Hashable {
|
|
let name: String
|
|
|
|
init(name: String) {
|
|
self.name = name
|
|
}
|
|
|
|
deinit {
|
|
Swift.print("Deinit \(name)")
|
|
}
|
|
|
|
func hash(into hasher: inout Hasher) {}
|
|
|
|
static func ==(lhs: MyThing, rhs: MyThing) -> Bool {
|
|
return false
|
|
}
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [noinline] @$s21bridged_casts_folding26doSomethingWithAnyHashableyys0gH0VF : $@convention(thin) (@in_guaranteed AnyHashable) -> () {
|
|
// CHECK: %2 = alloc_stack $AnyHashable
|
|
// CHECK: copy_addr %0 to [initialization] %2 : $*AnyHashable
|
|
// CHECK: checked_cast_addr_br take_always AnyHashable in %2 : $*AnyHashable to MyThing
|
|
@inline(never)
|
|
func doSomethingWithAnyHashable(_ item: AnyHashable) {
|
|
_ = item as? MyThing
|
|
}
|
|
|
|
@inline(never)
|
|
public func testMyThing() {
|
|
let x = MyThing(name: "B")
|
|
doSomethingWithAnyHashable(x)
|
|
}
|