Sema: Don't reuse PreparedOverload from normal type checking in salvage()

We want to re-prepare our overloads, since now they will contain fixes.
This commit is contained in:
Slava Pestov
2025-10-10 15:33:53 -04:00
parent 036db6fb08
commit a8d896ab8f
6 changed files with 50 additions and 19 deletions

View File

@@ -16837,16 +16837,24 @@ ConstraintSystem::simplifyConstraint(const Constraint &constraint) {
// FIXME: Transitional hack.
bool enablePreparedOverloads = getASTContext().TypeCheckerOpts.SolverEnablePreparedOverloads;
bool forDiagnostics = inSalvageMode();
// Don't reuse prepared overloads from normal type checking in salvage(),
// since they will contain fixes and such.
auto *preparedOverload = constraint.getPreparedOverload();
if (!preparedOverload) {
if (enablePreparedOverloads &&
constraint.getOverloadChoice().canBePrepared()) {
preparedOverload = prepareOverload(constraint.getOverloadChoice(),
constraint.getDeclContext(),
constraint.getLocator());
const_cast<Constraint &>(constraint).setPreparedOverload(preparedOverload);
}
if (preparedOverload &&
preparedOverload->wasForDiagnostics() != forDiagnostics) {
preparedOverload = nullptr;
}
if (!preparedOverload &&
enablePreparedOverloads &&
constraint.getOverloadChoice().canBePrepared()) {
preparedOverload = prepareOverload(constraint.getOverloadChoice(),
constraint.getDeclContext(),
constraint.getLocator(),
forDiagnostics);
const_cast<Constraint &>(constraint).setPreparedOverload(preparedOverload);
}
resolveOverload(constraint.getOverloadChoice(),