Merge pull request #21509 from DougGregor/submap-superclass-conformance
[Substitution map] When the superclass conforms to a protocol directly use it
diff --git a/lib/AST/SubstitutionMap.cpp b/lib/AST/SubstitutionMap.cpp
index 2336176..525d5f8 100644
--- a/lib/AST/SubstitutionMap.cpp
+++ b/lib/AST/SubstitutionMap.cpp
@@ -352,19 +352,17 @@
return None;
};
+ // Check whether the superclass conforms.
+ if (auto superclass = genericSig->getSuperclassBound(type)) {
+ LookUpConformanceInSignature lookup(*getGenericSignature());
+ if (auto conformance = lookup(type->getCanonicalType(), superclass, proto))
+ return conformance;
+ }
+
// If the type doesn't conform to this protocol, the result isn't formed
// from these requirements.
- if (!genericSig->conformsToProtocol(type, proto)) {
- // Check whether the superclass conforms.
- if (auto superclass = genericSig->getSuperclassBound(type)) {
- return LookUpConformanceInSignature(*getGenericSignature())(
- type->getCanonicalType(),
- superclass,
- proto);
- }
-
+ if (!genericSig->conformsToProtocol(type, proto))
return None;
- }
auto accessPath =
genericSig->getConformanceAccessPath(type, proto);