Skip to content

Commit a9e47ec

Browse files
committed
RequirementMachine: Hook up AbstractGenericSignatureRequestRQM to -requirement-machine-generic-signatures flag
1 parent d0a8abb commit a9e47ec

File tree

1 file changed

+52
-14
lines changed

1 file changed

+52
-14
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8559,24 +8559,62 @@ AbstractGenericSignatureRequest::evaluate(
85598559
canSignatureResult.getInt());
85608560
}
85618561

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);
85668567

8567-
auto source =
8568-
GenericSignatureBuilder::FloatingRequirementSource::forAbstract();
8568+
auto source =
8569+
GenericSignatureBuilder::FloatingRequirementSource::forAbstract();
85698570

8570-
for (auto param : addedParameters)
8571-
builder.addGenericParameter(param);
8571+
for (auto param : addedParameters)
8572+
builder.addGenericParameter(param);
85728573

8573-
for (const auto &req : addedRequirements)
8574-
builder.addRequirement(req, source, nullptr);
8574+
for (const auto &req : addedRequirements)
8575+
builder.addRequirement(req, source, nullptr);
85758576

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+
}
85808618
}
85818619

85828620
GenericSignatureWithError

0 commit comments

Comments
 (0)