mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Deserializing a witness record in a conformance may fail if either of the requirement or witness changed name or type, most likely due to SDK modernization changes across Swift versions. When this happens, leave an opaque placeholder in the conformance to indicate that the witness exists but we don't get to see it. For expedience, right now this just witnesses the requirement to itself, so that code in the type checker or elsewhere that tries to ad-hoc devirtualize references to the requirement just gets the requirement back. Arguably, we shouldn't include the witness at all in imported conformances, since they should be an implementation detail, but that's a bigger, riskier change. This patch as is should be enough to address rdar://problem/31185053.
66 lines
2.3 KiB
Swift
66 lines
2.3 KiB
Swift
|
|
// Swift 3 sees the ObjC class NSRuncibleSpoon as the class, and uses methods
|
|
// with type signatures involving NSRuncibleSpoon to conform to protocols
|
|
// across the language boundary. Swift 4 sees the type as bridged to
|
|
// a RuncibleSpoon value type, but still needs to be able to use conformances
|
|
// declared by Swift 3.
|
|
|
|
// Swift 4
|
|
|
|
import SomeObjCModule
|
|
import SomeSwift3Module
|
|
|
|
public func testMixAndMatch(bridged: RuncibleSpoon, unbridged: NSRuncibleSpoon) {
|
|
let objcInstanceViaClass
|
|
= SomeObjCClass(someSwiftInitRequirement: bridged)
|
|
let objcClassAsProtocol: SomeSwift3Protocol.Type = SomeObjCClass.self
|
|
let objcInstanceViaProtocol
|
|
= objcClassAsProtocol.init(someSwiftInitRequirement: unbridged)
|
|
|
|
var bridgedSink: RuncibleSpoon
|
|
var unbridgedSink: NSRuncibleSpoon
|
|
|
|
let swiftPropertyViaClass = objcInstanceViaClass.someSwiftPropertyRequirement
|
|
bridgedSink = swiftPropertyViaClass
|
|
let swiftPropertyViaProtocol = objcInstanceViaProtocol.someSwiftPropertyRequirement
|
|
unbridgedSink = swiftPropertyViaProtocol
|
|
|
|
objcInstanceViaClass.someSwiftMethodRequirement(bridged)
|
|
objcInstanceViaProtocol.someSwiftMethodRequirement(unbridged)
|
|
|
|
let swiftInstanceViaClass
|
|
= SomeSwift3Class(someObjCInitRequirement: unbridged)
|
|
let swiftClassAsProtocol: SomeObjCProtocol.Type = SomeSwift3Class.self
|
|
let swiftInstanceViaProtocol
|
|
= swiftClassAsProtocol.init(someObjCInitRequirement: bridged)
|
|
|
|
let objcPropertyViaClass = swiftInstanceViaClass.someObjCPropertyRequirement
|
|
unbridgedSink = objcPropertyViaClass
|
|
let objcPropertyViaProtocol = swiftInstanceViaProtocol.someObjCPropertyRequirement
|
|
bridgedSink = objcPropertyViaProtocol
|
|
|
|
swiftInstanceViaClass.someObjCMethodRequirement(unbridged)
|
|
swiftInstanceViaProtocol.someObjCMethodRequirement(bridged)
|
|
|
|
_ = bridgedSink
|
|
_ = unbridgedSink
|
|
}
|
|
|
|
public protocol SomeSwift4Protocol {
|
|
init(someSwiftInitRequirement: RuncibleSpoon)
|
|
func someSwiftMethodRequirement(_: RuncibleSpoon)
|
|
var someSwiftPropertyRequirement: RuncibleSpoon { get }
|
|
}
|
|
|
|
extension SomeObjCClass: SomeSwift4Protocol {}
|
|
|
|
public class SomeSwift4Class: NSObject {
|
|
public required init(someObjCInitRequirement x: RuncibleSpoon) {
|
|
someObjCPropertyRequirement = x
|
|
}
|
|
public func someObjCMethodRequirement(_: RuncibleSpoon) {}
|
|
public var someObjCPropertyRequirement: RuncibleSpoon
|
|
}
|
|
|
|
extension SomeSwift4Class: SomeObjCProtocol {}
|