Skip to content

Commit 5eb29ae

Browse files
committed
GSB: Relax -requirement-machine-protocol-signatures=verify check a little
We're getting too many false positives. If the Requirement Machine's result is a prefix of the GSB's result, and the extra requirements produced by the GSB are all same-type parameters, assume it's a GSB bug.
1 parent f518c80 commit 5eb29ae

File tree

1 file changed

+15
-14
lines changed

1 file changed

+15
-14
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8662,23 +8662,24 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
86628662

86638663
auto compare = [&](ArrayRef<Requirement> rqmResult,
86648664
ArrayRef<Requirement> gsbResult) {
8665-
if (proto->getParentModule()->isStdlibModule() &&
8666-
(proto->getName().is("Collection") ||
8667-
proto->getName().is("StringProtocol"))) {
8668-
if (rqmResult.size() > gsbResult.size())
8669-
return false;
8670-
} else {
8671-
if (rqmResult.size() != gsbResult.size())
8665+
if (rqmResult.size() > gsbResult.size())
8666+
return false;
8667+
8668+
if (!std::equal(rqmResult.begin(),
8669+
rqmResult.end(),
8670+
gsbResult.begin(),
8671+
[](const Requirement &lhs,
8672+
const Requirement &rhs) {
8673+
return lhs.getCanonical() == rhs.getCanonical();
8674+
}))
8675+
return false;
8676+
8677+
for (auto req : gsbResult.slice(rqmResult.size())) {
8678+
if (req.getKind() != RequirementKind::SameType)
86728679
return false;
86738680
}
86748681

8675-
return std::equal(rqmResult.begin(),
8676-
rqmResult.end(),
8677-
gsbResult.begin(),
8678-
[](const Requirement &lhs,
8679-
const Requirement &rhs) {
8680-
return lhs.getCanonical() == rhs.getCanonical();
8681-
});
8682+
return true;
86828683
};
86838684

86848685
switch (ctx.LangOpts.RequirementMachineProtocolSignatures) {

0 commit comments

Comments
 (0)