[Diagnostics] Adjust requirement failures to retrieve conformance information from locator

Conditional conformances previously relied on `CheckedConformances`
cache to retrieve information about conditional requirements from
base conformance, but that is not really necessary anymore since
`ConformanceRequirement` element could provide all required info.
This commit is contained in:
Pavel Yaskevich
2021-01-08 11:39:12 -08:00
parent 87cc597d19
commit 5f20eb661e
2 changed files with 9 additions and 28 deletions

View File

@@ -205,23 +205,14 @@ const Requirement &RequirementFailure::getRequirement() const {
ProtocolConformance *RequirementFailure::getConformanceForConditionalReq(
ConstraintLocator *locator) {
auto &solution = getSolution();
auto reqElt = locator->castLastElementTo<LocatorPathElt::AnyRequirement>();
if (!reqElt.isConditionalRequirement())
return nullptr;
auto path = locator->getPath();
auto *conformanceLoc = getConstraintLocator(getRawAnchor(), path.drop_back());
auto result = llvm::find_if(
solution.Conformances,
[&](const std::pair<ConstraintLocator *, ProtocolConformanceRef>
&conformance) { return conformance.first == conformanceLoc; });
assert(result != solution.Conformances.end());
auto conformance = result->second;
assert(conformance.isConcrete());
return conformance.getConcrete();
auto conformanceRef =
locator->findLast<LocatorPathElt::ConformanceRequirement>();
assert(conformanceRef && "Invalid locator for a conditional requirement");
return conformanceRef->getConformance();
}
ValueDecl *RequirementFailure::getDeclRef() const {