Files
swift-mirror/validation-test/compiler_crashers_2_fixed/0059-sr3321.swift
Slava Pestov 9db6b10059 AST: Targeted fix for conformance lookup issue
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>.
2017-04-03 15:35:10 -07:00

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>())