Files
swift-mirror/test/Compatibility/MixAndMatch/Inputs/witness_change_swift3_leaf.swift
Joe Groff e3e0f440a1 Serialization: Recovery for protocol conformances with changed witness or requirement signatures.
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.
2017-05-09 09:15:04 -07:00

72 lines
2.9 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 3, importing Swift 3 and Swift 4 code
import SomeObjCModule
import SomeSwift3Module
import SomeSwift4Module
func testMatchAndMix(bridged: RuncibleSpoon, unbridged: NSRuncibleSpoon) {
let objcInstanceViaClass
= SomeObjCClass(someSwiftInitRequirement: unbridged)
let objcClassAsS3Protocol: SomeSwift3Protocol.Type = SomeObjCClass.self
let objcInstanceViaS3Protocol
= objcClassAsS3Protocol.init(someSwiftInitRequirement: unbridged)
let objcClassAsS4Protocol: SomeSwift4Protocol.Type = SomeObjCClass.self
let objcInstanceViaS4Protocol
= objcClassAsS4Protocol.init(someSwiftInitRequirement: bridged)
var bridgedSink: RuncibleSpoon
var unbridgedSink: NSRuncibleSpoon
let swiftPropertyViaClass = objcInstanceViaClass.someSwiftPropertyRequirement
unbridgedSink = swiftPropertyViaClass
let swiftPropertyViaS3Protocol = objcInstanceViaS3Protocol.someSwiftPropertyRequirement
unbridgedSink = swiftPropertyViaS3Protocol
let swiftPropertyViaS4Protocol = objcInstanceViaS4Protocol.someSwiftPropertyRequirement
bridgedSink = swiftPropertyViaS4Protocol
objcInstanceViaClass.someSwiftMethodRequirement(unbridged)
objcInstanceViaS3Protocol.someSwiftMethodRequirement(unbridged)
objcInstanceViaS4Protocol.someSwiftMethodRequirement(bridged)
let swift3InstanceViaClass
= SomeSwift3Class(someObjCInitRequirement: unbridged)
let swift3ClassAsProtocol: SomeObjCProtocol.Type = SomeSwift3Class.self
let swift3InstanceViaProtocol
= swift3ClassAsProtocol.init(someObjCInitRequirement: unbridged)
let objcPropertyViaClassS3 = swift3InstanceViaClass.someObjCPropertyRequirement
unbridgedSink = objcPropertyViaClassS3
let objcPropertyViaProtocolS3 = swift3InstanceViaProtocol.someObjCPropertyRequirement
unbridgedSink = objcPropertyViaProtocolS3
swift3InstanceViaClass.someObjCMethodRequirement(unbridged)
swift3InstanceViaProtocol.someObjCMethodRequirement(unbridged)
let swift4InstanceViaClass
= SomeSwift4Class(someObjCInitRequirement: bridged)
let swift4ClassAsProtocol: SomeObjCProtocol.Type = SomeSwift4Class.self
let swift4InstanceViaProtocol
= swift4ClassAsProtocol.init(someObjCInitRequirement: unbridged)
let objcPropertyViaClassS4 = swift4InstanceViaClass.someObjCPropertyRequirement
bridgedSink = objcPropertyViaClassS4
let objcPropertyViaProtocolS4 = swift4InstanceViaProtocol.someObjCPropertyRequirement
unbridgedSink = objcPropertyViaProtocolS4
swift4InstanceViaClass.someObjCMethodRequirement(bridged)
swift4InstanceViaProtocol.someObjCMethodRequirement(unbridged)
_ = bridgedSink
_ = unbridgedSink
}