@@ -8559,24 +8559,62 @@ AbstractGenericSignatureRequest::evaluate(
8559
8559
canSignatureResult.getInt ());
8560
8560
}
8561
8561
8562
- // Create a generic signature that will form the signature.
8563
- GenericSignatureBuilder builder (ctx);
8564
- if (baseSignature)
8565
- builder.addGenericSignature (baseSignature);
8562
+ auto buildViaGSB = [&]() {
8563
+ // Create a generic signature that will form the signature.
8564
+ GenericSignatureBuilder builder (ctx);
8565
+ if (baseSignature)
8566
+ builder.addGenericSignature (baseSignature);
8566
8567
8567
- auto source =
8568
- GenericSignatureBuilder::FloatingRequirementSource::forAbstract ();
8568
+ auto source =
8569
+ GenericSignatureBuilder::FloatingRequirementSource::forAbstract ();
8569
8570
8570
- for (auto param : addedParameters)
8571
- builder.addGenericParameter (param);
8571
+ for (auto param : addedParameters)
8572
+ builder.addGenericParameter (param);
8572
8573
8573
- for (const auto &req : addedRequirements)
8574
- builder.addRequirement (req, source, nullptr );
8574
+ for (const auto &req : addedRequirements)
8575
+ builder.addRequirement (req, source, nullptr );
8575
8576
8576
- bool hadError = builder.hadAnyError ();
8577
- auto result = std::move (builder).computeGenericSignature (
8578
- /* allowConcreteGenericParams=*/ true );
8579
- return GenericSignatureWithError (result, hadError);
8577
+ bool hadError = builder.hadAnyError ();
8578
+ auto result = std::move (builder).computeGenericSignature (
8579
+ /* allowConcreteGenericParams=*/ true );
8580
+ return GenericSignatureWithError (result, hadError);
8581
+ };
8582
+
8583
+ auto buildViaRQM = [&]() {
8584
+ return evaluateOrDefault (
8585
+ ctx.evaluator ,
8586
+ AbstractGenericSignatureRequestRQM{
8587
+ baseSignature.getPointer (),
8588
+ std::move (addedParameters),
8589
+ std::move (addedRequirements)},
8590
+ GenericSignatureWithError ());
8591
+ };
8592
+
8593
+ switch (ctx.LangOpts .RequirementMachineGenericSignatures ) {
8594
+ case RequirementMachineMode::Disabled:
8595
+ return buildViaGSB ();
8596
+
8597
+ case RequirementMachineMode::Enabled:
8598
+ return buildViaRQM ();
8599
+
8600
+ case RequirementMachineMode::Verify: {
8601
+ auto rqmResult = buildViaRQM ();
8602
+ auto gsbResult = buildViaGSB ();
8603
+
8604
+ if (!rqmResult.getPointer () && !gsbResult.getPointer ())
8605
+ return gsbResult;
8606
+
8607
+ if (!rqmResult.getPointer ()->isEqual (gsbResult.getPointer ())) {
8608
+ llvm::errs () << " RequirementMachine generic signature minimization is broken:\n " ;
8609
+ llvm::errs () << " RequirementMachine says: " << rqmResult.getPointer () << " \n " ;
8610
+ llvm::errs () << " GenericSignatureBuilder says: " << gsbResult.getPointer () << " \n " ;
8611
+
8612
+ abort ();
8613
+ }
8614
+
8615
+ return gsbResult;
8616
+ }
8617
+ }
8580
8618
}
8581
8619
8582
8620
GenericSignatureWithError
0 commit comments