mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
When there's an Objective-C protocol that adopts other protocols, the other protocols become part of the requirement signature. If that can change, Swift conformances to that protocol will get very confused when it comes time to deserialize the conformances that satisfy the requirement signature. To recover from this, just deserialize /all/ trailing conformances, rather than follow the requirement signature, and match them up after the fact. (This only works for Objective-C protocols where we know all conformance requirements represent inherited protocols, as opposed to constraints on associated types.) rdar://problem/33356098
76 lines
3.0 KiB
Swift
76 lines
3.0 KiB
Swift
// RUN: %empty-directory(%t)
|
|
|
|
// RUN: %target-swift-frontend -emit-module -o %t -module-name Lib -I %S/Inputs/custom-modules -Xcc -DNO_EXTRA_PROTOCOLS %s
|
|
// RUN: %target-swift-frontend -typecheck -DTEST -Xcc -DNO_EXTRA_PROTOCOLS -I %t -I %S/Inputs/custom-modules %s
|
|
// RUN: %target-swift-frontend -emit-ir -DTEST -Xcc -DEXTRA_PROTOCOL_FIRST -I %t -I %S/Inputs/custom-modules %s -o /dev/null
|
|
|
|
// RUN: %target-swift-frontend -emit-module -o %t -module-name Lib -I %S/Inputs/custom-modules -Xcc -DEXTRA_PROTOCOL_FIRST %s
|
|
// RUN: %target-swift-frontend -typecheck -DTEST -Xcc -DEXTRA_PROTOCOL_FIRST -I %t -I %S/Inputs/custom-modules %s
|
|
// RUN: %target-swift-frontend -emit-ir -DTEST -Xcc -DNO_EXTRA_PROTOCOLS -I %t -I %S/Inputs/custom-modules %s -o /dev/null
|
|
|
|
|
|
// RUN: %target-swift-frontend -emit-module -o %t -module-name Lib -I %S/Inputs/custom-modules -Xcc -DNO_EXTRA_PROTOCOLS %s
|
|
// RUN: %target-swift-frontend -typecheck -DTEST -Xcc -DNO_EXTRA_PROTOCOLS -I %t -I %S/Inputs/custom-modules %s
|
|
// RUN: %target-swift-frontend -emit-ir -DTEST -Xcc -DEXTRA_PROTOCOL_MIDDLE -I %t -I %S/Inputs/custom-modules %s -o /dev/null
|
|
|
|
// RUN: %target-swift-frontend -emit-module -o %t -module-name Lib -I %S/Inputs/custom-modules -Xcc -DEXTRA_PROTOCOL_MIDDLE %s
|
|
// RUN: %target-swift-frontend -typecheck -DTEST -Xcc -DEXTRA_PROTOCOL_MIDDLE -I %t -I %S/Inputs/custom-modules %s
|
|
// RUN: %target-swift-frontend -emit-ir -DTEST -Xcc -DNO_EXTRA_PROTOCOLS -I %t -I %S/Inputs/custom-modules %s -o /dev/null
|
|
|
|
|
|
// RUN: %target-swift-frontend -emit-module -o %t -module-name Lib -I %S/Inputs/custom-modules -Xcc -DNO_EXTRA_PROTOCOLS %s
|
|
// RUN: %target-swift-frontend -typecheck -DTEST -Xcc -DNO_EXTRA_PROTOCOLS -I %t -I %S/Inputs/custom-modules %s
|
|
// RUN: %target-swift-frontend -emit-ir -DTEST -Xcc -DEXTRA_PROTOCOL_LAST -I %t -I %S/Inputs/custom-modules %s -o /dev/null
|
|
|
|
// RUN: %target-swift-frontend -emit-module -o %t -module-name Lib -I %S/Inputs/custom-modules -Xcc -DEXTRA_PROTOCOL_LAST %s
|
|
// RUN: %target-swift-frontend -typecheck -DTEST -Xcc -DEXTRA_PROTOCOL_LAST -I %t -I %S/Inputs/custom-modules %s
|
|
// RUN: %target-swift-frontend -emit-ir -DTEST -Xcc -DNO_EXTRA_PROTOCOLS -I %t -I %S/Inputs/custom-modules %s -o /dev/null
|
|
|
|
|
|
// REQUIRES: objc_interop
|
|
|
|
#if TEST
|
|
|
|
import Lib
|
|
import ProtocolInheritance
|
|
|
|
func useSubProto<T: SubProto>(_: T) {}
|
|
func useConsistentProto<T: Order2_ConsistentBaseProto>(_: T) {}
|
|
func useFickleProto<T: Order1_FickleBaseProto>(_: T) {}
|
|
|
|
func test(obj: Impl) {
|
|
useConsistentProto(obj)
|
|
useFickleProto(obj)
|
|
useSubProto(obj)
|
|
}
|
|
|
|
protocol ForceDeserializationProto: SubProto {}
|
|
extension Impl: ForceDeserializationProto {}
|
|
|
|
func test(obj: PartialImpl) {
|
|
useConsistentProto(obj)
|
|
useSubProto(obj)
|
|
}
|
|
|
|
extension PartialImpl: ForceDeserializationProto {}
|
|
|
|
#else // TEST
|
|
|
|
import ProtocolInheritance
|
|
|
|
open class Impl: SubProto {
|
|
public func consistent() {}
|
|
}
|
|
|
|
extension Impl: Order1_FickleBaseProto, Order3_FickleBaseProto, Order5_FickleBaseProto {
|
|
public func fickle() {}
|
|
}
|
|
|
|
open class PartialImpl: SubProto {
|
|
public func consistent() {}
|
|
public func fickle() {}
|
|
}
|
|
|
|
|
|
#endif // TEST
|