blob: 9abcd6ed59a00efb0a1f033d93292c5118b09289 [file] [log] [blame]
// RUN: %target-typecheck-verify-swift
// REQUIRES: objc_interop
// 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 A {
var x = 0
}
struct B : _ObjectiveCBridgeable {
func _bridgeToObjectiveC() -> A {
return A()
}
static func _forceBridgeFromObjectiveC(
_ x: A,
result: inout B?
){
}
static func _conditionallyBridgeFromObjectiveC(
_ x: A,
result: inout B?
) -> Bool {
return true
}
}
var a: [A] = []
var b: [B] = []
a = b as [A]
b = a // expected-error {{cannot assign value of type '[A]' to type '[B]'}}
var aa: [[A]] = []
var bb: [[B]] = []
aa = bb // expected-error {{cannot assign value of type '[[B]]' to type '[[A]]'}}
bb = aa // expected-error {{cannot assign value of type '[[A]]' to type '[[B]]'}}
class C {
}
// In this case, bridged conversion should win
class E {
var x = 0
}
struct F : _ObjectiveCBridgeable {
func _bridgeToObjectiveC() -> E {
return E()
}
static func _forceBridgeFromObjectiveC(
_ x: E,
result: inout F?
) {
}
static func _conditionallyBridgeFromObjectiveC(
_ x: E,
result: inout F?
) -> Bool {
return true
}
}
var e: [E] = []
var f: [F] = []
e = f as [E]
f = e // expected-error {{cannot assign value of type '[E]' to type '[F]'}}
class G {
var x = 0
}
struct H : _ObjectiveCBridgeable {
func _bridgeToObjectiveC() -> G {
return G()
}
static func _forceBridgeFromObjectiveC(
_ x: G,
result: inout H?
) {
}
static func _conditionallyBridgeFromObjectiveC(
_ x: G,
result: inout H?
) -> Bool {
return true
}
}
var g: [G] = []
var h: [H] = []
g = h as [G] // should type check, but cause a failure at runtime
struct I : _ObjectiveCBridgeable {
func _bridgeToObjectiveC() -> AnyObject {
return A()
}
static func _forceBridgeFromObjectiveC(
_ x: AnyObject,
result: inout I?
) {
}
static func _conditionallyBridgeFromObjectiveC(
_ x: AnyObject,
result: inout I?
) -> Bool {
return true
}
}
var aoa: [AnyObject] = []
var i: [I] = []
aoa = i as [AnyObject]
i = aoa // expected-error {{cannot assign value of type '[AnyObject]' to type '[I]'}}