Skip to content

Commit b5d21f2

Browse files
committed
RequirementMachine: Verify same-type requirements in protocols as well
1 parent 50d6843 commit b5d21f2

File tree

1 file changed

+22
-17
lines changed

1 file changed

+22
-17
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8630,6 +8630,27 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
86308630
ArrayRef<Requirement>());
86318631
};
86328632

8633+
auto compare = [&](ArrayRef<Requirement> rqmResult,
8634+
ArrayRef<Requirement> gsbResult) {
8635+
if (proto->getParentModule()->isStdlibModule() &&
8636+
(proto->getName().is("Collection") ||
8637+
proto->getName().is("StringProtocol"))) {
8638+
if (rqmResult.size() > gsbResult.size())
8639+
return false;
8640+
} else {
8641+
if (rqmResult.size() != gsbResult.size())
8642+
return false;
8643+
}
8644+
8645+
return std::equal(rqmResult.begin(),
8646+
rqmResult.end(),
8647+
gsbResult.begin(),
8648+
[](const Requirement &lhs,
8649+
const Requirement &rhs) {
8650+
return lhs.getCanonical() == rhs.getCanonical();
8651+
});
8652+
};
8653+
86338654
switch (ctx.LangOpts.RequirementMachineProtocolSignatures) {
86348655
case RequirementMachineMode::Disabled:
86358656
return buildViaGSB();
@@ -8641,23 +8662,7 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
86418662
auto rqmResult = buildViaRQM();
86428663
auto gsbResult = buildViaGSB();
86438664

8644-
// For now, only compare conformance requirements, since those are the
8645-
// important ones from the ABI perspective.
8646-
SmallVector<Requirement, 2> rqmConformances;
8647-
for (auto req : rqmResult) {
8648-
if (req.getKind() == RequirementKind::Conformance)
8649-
rqmConformances.push_back(req);
8650-
}
8651-
SmallVector<Requirement, 2> gsbConformances;
8652-
for (auto req : gsbResult) {
8653-
if (req.getKind() == RequirementKind::Conformance)
8654-
gsbConformances.push_back(req);
8655-
}
8656-
8657-
if (rqmConformances.size() != gsbConformances.size() ||
8658-
!std::equal(rqmConformances.begin(),
8659-
rqmConformances.end(),
8660-
gsbConformances.begin())) {
8665+
if (!compare(rqmResult, gsbResult)) {
86618666
llvm::errs() << "RequirementMachine protocol signature minimization is broken:\n";
86628667
llvm::errs() << "Protocol: " << proto->getName() << "\n";
86638668

0 commit comments

Comments
 (0)