@@ -8388,7 +8388,7 @@ AbstractGenericSignatureRequest::evaluate(
8388
8388
auto gsbResult = buildViaGSB ();
8389
8389
8390
8390
if (!rqmResult.getPointer () && !gsbResult.getPointer ())
8391
- return gsbResult ;
8391
+ return rqmResult ;
8392
8392
8393
8393
if (!rqmResult.getPointer ()->isEqual (gsbResult.getPointer ())) {
8394
8394
llvm::errs () << " RequirementMachine generic signature minimization is broken:\n " ;
@@ -8398,7 +8398,7 @@ AbstractGenericSignatureRequest::evaluate(
8398
8398
abort ();
8399
8399
}
8400
8400
8401
- return gsbResult ;
8401
+ return rqmResult ;
8402
8402
}
8403
8403
}
8404
8404
}
@@ -8558,7 +8558,7 @@ InferredGenericSignatureRequest::evaluate(
8558
8558
auto gsbResult = buildViaGSB ();
8559
8559
8560
8560
if (!rqmResult.getPointer () && !gsbResult.getPointer ())
8561
- return gsbResult ;
8561
+ return rqmResult ;
8562
8562
8563
8563
if (!rqmResult.getPointer ()->isEqual (gsbResult.getPointer ())) {
8564
8564
llvm::errs () << " RequirementMachine generic signature minimization is broken:\n " ;
@@ -8568,7 +8568,7 @@ InferredGenericSignatureRequest::evaluate(
8568
8568
abort ();
8569
8569
}
8570
8570
8571
- return gsbResult ;
8571
+ return rqmResult ;
8572
8572
}
8573
8573
}
8574
8574
}
@@ -8630,6 +8630,27 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
8630
8630
ArrayRef<Requirement>());
8631
8631
};
8632
8632
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
+
8633
8654
switch (ctx.LangOpts .RequirementMachineProtocolSignatures ) {
8634
8655
case RequirementMachineMode::Disabled:
8635
8656
return buildViaGSB ();
@@ -8641,23 +8662,7 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
8641
8662
auto rqmResult = buildViaRQM ();
8642
8663
auto gsbResult = buildViaGSB ();
8643
8664
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)) {
8661
8666
llvm::errs () << " RequirementMachine protocol signature minimization is broken:\n " ;
8662
8667
llvm::errs () << " Protocol: " << proto->getName () << " \n " ;
8663
8668
@@ -8672,7 +8677,7 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
8672
8677
abort ();
8673
8678
}
8674
8679
8675
- return gsbResult ;
8680
+ return rqmResult ;
8676
8681
}
8677
8682
}
8678
8683
}
0 commit comments