Sema: Only use PreparedOverload::Change::AddedBindConstraint if the locator didn't change

For a Bind constraint generated by a same-type requirement, we must
preserve the locator so we need to record it like any other kind of
constraint.

This fixes a diagnostic regression with -solver-enable-prepared-overloads.
This commit is contained in:
Slava Pestov
2025-10-10 14:29:02 -04:00
parent 773d3271e9
commit 036db6fb08
3 changed files with 21 additions and 7 deletions

View File

@@ -16529,14 +16529,22 @@ void ConstraintSystem::addConstraint(ConstraintKind kind, Type first,
PreparedOverloadBuilder *preparedOverload) {
if (preparedOverload) {
ASSERT(PreparingOverload);
if (kind == ConstraintKind::Bind) {
auto *locatorPtr = getConstraintLocator(locator);
// Fast path to save on memory usage.
if (kind == ConstraintKind::Bind &&
locatorPtr == preparedOverload->Locator) {
ASSERT(!isFavored);
preparedOverload->addedBindConstraint(first, second);
return;
}
auto c = Constraint::create(*this, kind, first, second,
getConstraintLocator(locator));
if (isFavored) c->setFavored();
auto c = Constraint::create(*this, kind, first, second, locatorPtr);
if (isFavored)
c->setFavored();
preparedOverload->addedConstraint(c);
return;
}