[swift-dev] SubstitutionMap questions
Jacob Bandes-Storch
jtbandes at gmail.com
Fri Dec 30 14:14:52 CST 2016
Happy holidays :-)
I started looking at this bug to see if I could figure out how to fix it:
https://bugs.swift.org/browse/SR-3500
As the bug author points out, there is a TODO in
GenericSignature::getSubstitutionMap, saying it needs to handle same-type
requirements:
https://github.com/apple/swift/blob/474096b9cbd6ff7ac998d7cea41d629512e25570/lib/AST/GenericSignature.cpp#L276
Most of the stuff going on here is way over my head right now, but maybe I
can get there by asking some questions. Here is my repro case:
protocol P { associatedtype Pmember }
struct Bar {}
struct Foo: P { typealias Pmember = Bar }
protocol A {
associatedtype Amember: P
func doSomething() -> Amember.Pmember
}
extension A where Amember == Foo {
func extensionFunc() {
doSomething() // crash occurs when trying to subst() this call's
return type
}
}
Ultimately the problem is that, during
SILFunctionType::substGenericArgs, getMemberForBaseType() returns null when
called on the DependentMemberType (the function result type), because the
result of lookupConformances is not concrete:
https://github.com/apple/swift/blob/474096b9cbd6ff7ac998d7cea41d629512e25570/lib/AST/Type.cpp#L2843-L2845
Here are some things I don't understand:
1. Why does LookupConformanceFn return only a single conformance? Couldn't
there be more than one conformance for a particular generic param?
2. Why does finding an abstract conformance constitute a failure
of getMemberForBaseType?
3. At the lookupConformances call
<https://github.com/apple/swift/blob/474096b9cbd6ff7ac998d7cea41d629512e25570/lib/AST/Type.cpp#L2843-L2845>,
origBase is "τ_0_0.Amember", and substBase is the concrete type "Foo".
However, the LookUpConformanceInSubstitutionMap drops the substBase (
<https://github.com/apple/swift/blob/474096b9cbd6ff7ac998d7cea41d629512e25570/lib/AST/Type.cpp#L2891>
*conformingReplacementType)* on the floor
<https://github.com/apple/swift/blob/474096b9cbd6ff7ac998d7cea41d629512e25570/lib/AST/Type.cpp#L2891>.
Why?
4. Finally, is SubstitutionMap really the right place for same-type
requirements? Maybe getMemberForBaseType would need more context passed to
it than just the LookupConformanceFn?
Thanks,
Jacob
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20161230/1b3fe7f7/attachment.html>
More information about the swift-dev
mailing list