mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
When substituting a type like T.A.B where A and B are associated types and the conformance requirement on T.A is implied by conformance requirements on T, we would crash. The problem is that we have no way of representing an abstract conformance with nested concrete types. This patch adds a workaround that we can live with until ConformanceAccessPaths are plumbed through all the way. Fixes <rdar://problem/30737546> and <https://bugs.swift.org/browse/SR-3500>. Possibly fixes <rdar://problem/31334245>.
38 lines
898 B
Swift
38 lines
898 B
Swift
// RUN: %target-swift-frontend %s -emit-ir
|
|
// RUN: %target-swift-frontend %s -emit-ir -O
|
|
|
|
protocol ControllerB {
|
|
associatedtype T: Controller
|
|
}
|
|
|
|
protocol Controller {
|
|
associatedtype T
|
|
|
|
func shouldSelect<S: ControllerB>(_ a: T, b: S) where S.T == Self
|
|
}
|
|
|
|
struct ControllerAImpl {}
|
|
|
|
struct ControllerImpl : Controller {
|
|
typealias T = ControllerAImpl
|
|
|
|
func shouldSelect<S : ControllerB>(_ a: ControllerAImpl, b: S) where S.T == ControllerImpl {}
|
|
}
|
|
|
|
struct ControllerBImpl1 : ControllerB {
|
|
typealias T = ControllerImpl
|
|
}
|
|
|
|
struct ControllerBImpl2<C : Controller> : ControllerB {
|
|
typealias T = C
|
|
}
|
|
|
|
extension Controller {
|
|
func didSelect<S: ControllerB>(_ a: T, b: S) where S.T == Self {
|
|
shouldSelect(a, b: b)
|
|
}
|
|
}
|
|
|
|
ControllerImpl().didSelect(ControllerAImpl(), b: ControllerBImpl1())
|
|
ControllerImpl().didSelect(ControllerAImpl(), b: ControllerBImpl2<ControllerImpl>())
|