Skip to content

Commit 5f20eb6

Browse files
committed
[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.
1 parent 87cc597 commit 5f20eb6

File tree

2 files changed

+10
-29
lines changed

2 files changed

+10
-29
lines changed

lib/Sema/CSDiagnostics.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -205,23 +205,14 @@ const Requirement &RequirementFailure::getRequirement() const {
205205

206206
ProtocolConformance *RequirementFailure::getConformanceForConditionalReq(
207207
ConstraintLocator *locator) {
208-
auto &solution = getSolution();
209208
auto reqElt = locator->castLastElementTo<LocatorPathElt::AnyRequirement>();
210209
if (!reqElt.isConditionalRequirement())
211210
return nullptr;
212211

213-
auto path = locator->getPath();
214-
auto *conformanceLoc = getConstraintLocator(getRawAnchor(), path.drop_back());
215-
216-
auto result = llvm::find_if(
217-
solution.Conformances,
218-
[&](const std::pair<ConstraintLocator *, ProtocolConformanceRef>
219-
&conformance) { return conformance.first == conformanceLoc; });
220-
assert(result != solution.Conformances.end());
221-
222-
auto conformance = result->second;
223-
assert(conformance.isConcrete());
224-
return conformance.getConcrete();
212+
auto conformanceRef =
213+
locator->findLast<LocatorPathElt::ConformanceRequirement>();
214+
assert(conformanceRef && "Invalid locator for a conditional requirement");
215+
return conformanceRef->getConformance();
225216
}
226217

227218
ValueDecl *RequirementFailure::getDeclRef() const {

lib/Sema/ConstraintSystem.cpp

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5181,22 +5181,12 @@ static Optional<Requirement> getRequirement(ConstraintSystem &cs,
51815181
return None;
51825182

51835183
if (reqLoc->isConditionalRequirement()) {
5184-
auto path = reqLocator->getPath();
5185-
auto *conformanceLoc =
5186-
cs.getConstraintLocator(reqLocator->getAnchor(), path.drop_back());
5187-
5188-
auto conformances = cs.getCheckedConformances();
5189-
auto result = llvm::find_if(
5190-
conformances,
5191-
[&conformanceLoc](
5192-
const std::pair<ConstraintLocator *, ProtocolConformanceRef>
5193-
&conformance) { return conformance.first == conformanceLoc; });
5194-
assert(result != conformances.end());
5195-
5196-
auto conformance = result->second;
5197-
assert(conformance.isConcrete());
5198-
5199-
return conformance.getConditionalRequirements()[reqLoc->getIndex()];
5184+
auto conformanceRef =
5185+
reqLocator->findLast<LocatorPathElt::ConformanceRequirement>();
5186+
assert(conformanceRef && "Invalid locator for a conditional requirement");
5187+
5188+
auto conformance = conformanceRef->getConformance();
5189+
return conformance->getConditionalRequirements()[reqLoc->getIndex()];
52005190
}
52015191

52025192
if (auto openedGeneric =

0 commit comments

Comments
 (0)