blob: 29801d322bdff600ae413d5fc8b5476e9f4aec85 [file] [log] [blame]
// 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 // expected-warning{{conditional downcast from 'BridgedClass?' to 'BridgedStruct' is a bridging conversion; did you mean to use 'as'?}}{{14-17=as}}{{31-31=?}}
_ = objImplicitOpt as? BridgedStruct // expected-warning{{conditional downcast from 'BridgedClass?' to 'BridgedStruct' is a bridging conversion; did you mean to use 'as'?}}{{22-25=as}}{{39-39=?}}
_ = 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 dynamic 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 dynamic 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
}