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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
// 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]'}}
// expected-note@-1 {{arguments to generic parameter 'Element' ('A' and 'B') are expected to be equal}}
var aa: [[A]] = []
var bb: [[B]] = []
aa = bb // expected-error {{cannot assign value of type '[[B]]' to type '[[A]]'}}
// expected-note@-1 {{arguments to generic parameter 'Element' ('B' and 'A') are expected to be equal}}
bb = aa // expected-error {{cannot assign value of type '[[A]]' to type '[[B]]'}}
// expected-note@-1 {{arguments to generic parameter 'Element' ('A' and 'B') are expected to be equal}}
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]'}}
// expected-note@-1 {{arguments to generic parameter 'Element' ('E' and 'F') are expected to be equal}}
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]'}}
// expected-note@-1 {{arguments to generic parameter 'Element' ('AnyObject' and 'I') are expected to be equal}}
|