// 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 Root : Hashable { func hash(into hasher: inout Hasher) {} } func ==(x: Root, y: Root) -> Bool { return true } class ObjC : Root { var x = 0 } class DerivesObjC : ObjC { } class Unrelated : Root { } struct BridgedToObjC : Hashable, _ObjectiveCBridgeable { func _bridgeToObjectiveC() -> ObjC { return ObjC() } static func _forceBridgeFromObjectiveC( _ x: ObjC, result: inout BridgedToObjC? ) { } static func _conditionallyBridgeFromObjectiveC( _ x: ObjC, result: inout BridgedToObjC? ) -> Bool { return true } func hash(into hasher: inout Hasher) {} } func ==(x: BridgedToObjC, y: BridgedToObjC) -> Bool { return true } func testUpcastBridge() { var setR = Set() var setO = Set() var setD = Set() var setB = Set() // Upcast to object types. setR = setB as Set; _ = setR setO = setB as Set; _ = setO // Upcast object to bridged type setB = setO // expected-error{{cannot assign value of type 'Set' to type 'Set'}} // expected-note@-1 {{arguments to generic parameter 'Element' ('ObjC' and 'BridgedToObjC') are expected to be equal}} // Failed upcast setD = setB // expected-error{{cannot assign value of type 'Set' to type 'Set'}} // expected-note@-1 {{arguments to generic parameter 'Element' ('BridgedToObjC' and 'DerivesObjC') are expected to be equal}} } func testForcedDowncastBridge() { let setR = Set() let setO = Set() let setD = Set() let setB = Set() _ = setR as! Set _ = setO as Set _ = setD as! Set // expected-warning{{forced cast from 'Set' to 'Set' always succeeds; did you mean to use 'as'?}} _ = setB as! Set // expected-warning{{forced cast from 'Set' to 'Set' always succeeds; did you mean to use 'as'?}} _ = setB as! Set // expected-warning{{forced cast from 'Set' to 'Set' always succeeds; did you mean to use 'as'?}} _ = setB as! Set } func testConditionalDowncastBridge() { let setR = Set() let setO = Set() let setD = Set() let setB = Set() if let s = setR as? Set { _ = s } let s1 = setO as Set if let s = setD as? Set { _ = s } // expected-warning {{conditional cast from 'Set' to 'Set' always succeeds}} if let s = setB as? Set { _ = s } // expected-warning{{conditional cast from 'Set' to 'Set' always succeeds}} if let s = setB as? Set { _ = s } // expected-warning{{conditional cast from 'Set' to 'Set' always succeeds}} if let s = setB as? Set { _ = s } if let s = setB as? Set { _ = s } // OK _ = setR _ = setO _ = setD _ = setB _ = s1 }