@@ -16529,14 +16529,22 @@ void ConstraintSystem::addConstraint(ConstraintKind kind, Type first,
1652916529 PreparedOverloadBuilder *preparedOverload) {
1653016530 if (preparedOverload) {
1653116531 ASSERT(PreparingOverload);
16532- if (kind == ConstraintKind::Bind) {
16532+
16533+ auto *locatorPtr = getConstraintLocator(locator);
16534+
16535+ // Fast path to save on memory usage.
16536+ if (kind == ConstraintKind::Bind &&
16537+ locatorPtr == preparedOverload->Locator) {
1653316538 ASSERT(!isFavored);
1653416539 preparedOverload->addedBindConstraint(first, second);
1653516540 return;
1653616541 }
16537- auto c = Constraint::create(*this, kind, first, second,
16538- getConstraintLocator(locator));
16539- if (isFavored) c->setFavored();
16542+
16543+ auto c = Constraint::create(*this, kind, first, second, locatorPtr);
16544+
16545+ if (isFavored)
16546+ c->setFavored();
16547+
1654016548 preparedOverload->addedConstraint(c);
1654116549 return;
1654216550 }
@@ -16829,16 +16837,24 @@ ConstraintSystem::simplifyConstraint(const Constraint &constraint) {
1682916837
1683016838 // FIXME: Transitional hack.
1683116839 bool enablePreparedOverloads = getASTContext().TypeCheckerOpts.SolverEnablePreparedOverloads;
16840+ bool forDiagnostics = inSalvageMode();
1683216841
16842+ // Don't reuse prepared overloads from normal type checking in salvage(),
16843+ // since they will contain fixes and such.
1683316844 auto *preparedOverload = constraint.getPreparedOverload();
16834- if (!preparedOverload) {
16835- if (enablePreparedOverloads &&
16836- constraint.getOverloadChoice().canBePrepared()) {
16837- preparedOverload = prepareOverload(constraint.getOverloadChoice(),
16838- constraint.getDeclContext(),
16839- constraint.getLocator());
16840- const_cast<Constraint &>(constraint).setPreparedOverload(preparedOverload);
16841- }
16845+ if (preparedOverload &&
16846+ preparedOverload->wasForDiagnostics() != forDiagnostics) {
16847+ preparedOverload = nullptr;
16848+ }
16849+
16850+ if (!preparedOverload &&
16851+ enablePreparedOverloads &&
16852+ constraint.getOverloadChoice().canBePrepared()) {
16853+ preparedOverload = prepareOverload(constraint.getOverloadChoice(),
16854+ constraint.getDeclContext(),
16855+ constraint.getLocator(),
16856+ forDiagnostics);
16857+ const_cast<Constraint &>(constraint).setPreparedOverload(preparedOverload);
1684216858 }
1684316859
1684416860 resolveOverload(constraint.getOverloadChoice(),
0 commit comments