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
|
// RUN: %target-typecheck-verify-swift
// REQUIRES: objc_interop
// Test casting through a class type to a bridged value type.
// 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 NSObject { }
class BridgedClass : NSObject {
}
class SubclassOfBridgedClass : BridgedClass { }
struct BridgedStruct : _ObjectiveCBridgeable {
func _bridgeToObjectiveC() -> BridgedClass {
return BridgedClass()
}
static func _forceBridgeFromObjectiveC(
_ x: BridgedClass,
result: inout BridgedStruct?
) {
}
static func _conditionallyBridgeFromObjectiveC(
_ x: BridgedClass,
result: inout BridgedStruct?
) -> Bool {
return true
}
}
protocol P { }
extension NSObject : P { }
func testBridgeDowncast(_ obj: AnyObject, objOpt: AnyObject?,
objImplicitOpt: AnyObject!) -> BridgedStruct? {
let s1Opt = obj as? BridgedStruct
var s2Opt = objOpt as? BridgedStruct
var s3Opt = objImplicitOpt as? BridgedStruct
// Make sure we seem to have the right result type.
if s1Opt != nil { return s1Opt }
s2Opt = s1Opt
s2Opt = s3Opt
s3Opt = s1Opt
_ = s2Opt
return s1Opt
}
func testBridgeIsa(_ obj: AnyObject, objOpt: AnyObject?,
objImplicitOpt: AnyObject!) {
if obj is BridgedStruct { }
if objOpt is BridgedStruct { }
if objImplicitOpt is BridgedStruct { }
}
func testBridgeDowncastSuperclass(_ obj: NSObject, objOpt: NSObject?,
objImplicitOpt: NSObject!)
-> BridgedStruct? {
_ = obj as? BridgedStruct
_ = objOpt as? BridgedStruct
_ = objImplicitOpt as? BridgedStruct
}
func testBridgeDowncastExact(_ obj: BridgedClass, objOpt: BridgedClass?,
objImplicitOpt: BridgedClass!) -> BridgedStruct? {
_ = obj as? BridgedStruct // expected-warning{{conditional cast from 'BridgedClass' to 'BridgedStruct' always succeeds}}
_ = objOpt as? BridgedStruct
_ = objImplicitOpt as? BridgedStruct
_ = obj as! BridgedStruct // expected-warning{{forced cast from 'BridgedClass' to 'BridgedStruct' always succeeds; did you mean to use 'as'?}}{{11-14=as}}
_ = objOpt as! BridgedStruct // expected-warning{{forced cast from 'BridgedClass?' to 'BridgedStruct' only unwraps and bridges; did you mean to use '!' with 'as'?}}{{13-13=!}}{{14-17=as}}
_ = objImplicitOpt as! BridgedStruct // expected-warning{{forced cast from 'BridgedClass?' to 'BridgedStruct' only unwraps and bridges; did you mean to use '!' with 'as'?}}{{21-21=!}}{{22-25=as}}
_ = obj is BridgedStruct // expected-warning{{'is' test is always true}}
_ = objOpt is BridgedStruct // expected-warning{{checking a value with optional type 'BridgedClass?' against type 'BridgedStruct' succeeds whenever the value is non-nil; did you mean to use '!= nil'?}}{{14-30=!= nil}}
_ = objImplicitOpt is BridgedStruct // expected-warning{{checking a value with optional type 'BridgedClass?' against type 'BridgedStruct' succeeds whenever the value is non-nil; did you mean to use '!= nil'?}}{{22-38=!= nil}}
}
func testExplicitBridging(_ object: BridgedClass, value: BridgedStruct) {
var object = object
var value = value
object = value as BridgedClass
value = object as BridgedStruct
}
func testBridgingFromSubclass(_ obj: SubclassOfBridgedClass) {
_ = obj as! BridgedStruct // expected-warning{{forced cast from 'SubclassOfBridgedClass' to 'BridgedStruct' always succeeds; did you mean to use 'as'?}} {{11-14=as}}
_ = obj as BridgedStruct
}
// rdar://problem/30195862
func testCVarArg(bs: BridgedStruct, bsOpt: BridgedStruct?,
bsIUO: BridgedStruct!) {
_ = bs as P
_ = bsOpt! as P
_ = bsIUO! as P
_ = bsIUO as P
}
|