Skip to content

Commit 404eb2c

Browse files
committed
GSB: Relax verify check some more in RequirementSignatureRequest
The GSB sometimes emits redundant same-type requirements here. Only checking for a prefix would still trigger false positives, so relax it all the way to only consider conformance requirements, which are the important ones from an ABI standpoint.
1 parent c255f84 commit 404eb2c

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8664,21 +8664,32 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
86648664
ArrayRef<Requirement> gsbResult) {
86658665
if (rqmResult.size() > gsbResult.size())
86668666
return false;
8667+
8668+
SmallVector<Requirement, 2> rqmNonSameType;
8669+
SmallVector<Requirement, 2> gsbNonSameType;
8670+
8671+
for (auto req : rqmResult) {
8672+
if (req.getKind() != RequirementKind::SameType)
8673+
rqmNonSameType.push_back(req);
8674+
}
8675+
8676+
for (auto req : gsbResult) {
8677+
if (req.getKind() != RequirementKind::SameType)
8678+
gsbNonSameType.push_back(req);
8679+
}
8680+
8681+
if (rqmNonSameType.size() != gsbNonSameType.size())
8682+
return false;
86678683

8668-
if (!std::equal(rqmResult.begin(),
8669-
rqmResult.end(),
8670-
gsbResult.begin(),
8684+
if (!std::equal(rqmNonSameType.begin(),
8685+
rqmNonSameType.end(),
8686+
gsbNonSameType.begin(),
86718687
[](const Requirement &lhs,
86728688
const Requirement &rhs) {
86738689
return lhs.getCanonical() == rhs.getCanonical();
86748690
}))
86758691
return false;
86768692

8677-
for (auto req : gsbResult.slice(rqmResult.size())) {
8678-
if (req.getKind() != RequirementKind::SameType)
8679-
return false;
8680-
}
8681-
86828693
return true;
86838694
};
86848695

0 commit comments

Comments
 (0)