// RUN: %target-parse-verify-swift // REQUIRES: objc_interop class Root : Hashable { var hashValue: Int { return 0 } } func ==(x: Root, y: Root) -> Bool { return true } class ObjC : Root { var x = 0 } class DerivesObjC : ObjC { } struct BridgedToObjC : Hashable, _ObjectiveCBridgeable { static func _isBridgedToObjectiveC() -> Bool { return true } static func _getObjectiveCType() -> Any.Type { return ObjC.self } func _bridgeToObjectiveC() -> ObjC { return ObjC() } static func _forceBridgeFromObjectiveC( x: ObjC, inout result: BridgedToObjC? ) { } static func _conditionallyBridgeFromObjectiveC( x: ObjC, inout result: BridgedToObjC? ) -> Bool { return true } var hashValue: Int { return 0 } } 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 setO = setB // Upcast object to bridged type setB = setO // expected-error{{cannot assign a value of type 'Set' to a value of type 'Set'}} // Failed upcast setD = setB // expected-error{{cannot assign a value of type 'Set' to a value of type 'Set'}} } func testForcedDowncastBridge() { var setR = Set() var setO = Set() var setD = Set() var setB = Set() setR as! Set setO as! Set setD as! Set // expected-error {{'ObjC' is not a subtype of 'DerivesObjC'}} // TODO: the diagnostic for the below two examples should indicate that 'as' // should be used instead of 'as!' setB as! Set // expected-error {{'Root' is not a subtype of 'BridgedToObjC'}} setB as! Set // expected-error {{'ObjC' is not a subtype of 'BridgedToObjC'}} setB as! Set // expected-error {{'DerivesObjC' is not a subtype of 'BridgedToObjC'}} } func testConditionalDowncastBridge() { var setR = Set() var setO = Set() var setD = Set() var setB = Set() if let s = setR as? Set { } if let s = setO as? Set { } if let s = setD as? Set { } // expected-error {{'ObjC' is not a subtype of 'DerivesObjC'}} if let s = setB as? Set { } // expected-error {{'Root' is not a subtype of 'BridgedToObjC'}} if let s = setB as? Set { } // expected-error {{'ObjC' is not a subtype of 'BridgedToObjC'}} if let s = setB as? Set { } // expected-error {{'DerivesObjC' is not a subtype of 'BridgedToObjC'}} }