@@ -8388,7 +8388,7 @@ AbstractGenericSignatureRequest::evaluate(
83888388 auto gsbResult = buildViaGSB ();
83898389
83908390 if (!rqmResult.getPointer () && !gsbResult.getPointer ())
8391- return gsbResult ;
8391+ return rqmResult ;
83928392
83938393 if (!rqmResult.getPointer ()->isEqual (gsbResult.getPointer ())) {
83948394 llvm::errs () << " RequirementMachine generic signature minimization is broken:\n " ;
@@ -8398,7 +8398,7 @@ AbstractGenericSignatureRequest::evaluate(
83988398 abort ();
83998399 }
84008400
8401- return gsbResult ;
8401+ return rqmResult ;
84028402 }
84038403 }
84048404}
@@ -8558,7 +8558,7 @@ InferredGenericSignatureRequest::evaluate(
85588558 auto gsbResult = buildViaGSB ();
85598559
85608560 if (!rqmResult.getPointer () && !gsbResult.getPointer ())
8561- return gsbResult ;
8561+ return rqmResult ;
85628562
85638563 if (!rqmResult.getPointer ()->isEqual (gsbResult.getPointer ())) {
85648564 llvm::errs () << " RequirementMachine generic signature minimization is broken:\n " ;
@@ -8568,7 +8568,7 @@ InferredGenericSignatureRequest::evaluate(
85688568 abort ();
85698569 }
85708570
8571- return gsbResult ;
8571+ return rqmResult ;
85728572 }
85738573 }
85748574}
@@ -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
@@ -8672,7 +8677,7 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
86728677 abort ();
86738678 }
86748679
8675- return gsbResult ;
8680+ return rqmResult ;
86768681 }
86778682 }
86788683}
0 commit comments