Skip to content

Commit 036db6f

Browse files
committed
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.
1 parent 773d327 commit 036db6f

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

include/swift/Sema/PreparedOverload.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,10 @@ struct PreparedOverloadChange {
104104
/// For ChangeKind::AddedConstraint.
105105
Constraint *TheConstraint;
106106

107+
/// For ChangeKind::AddedBindConstraint.
107108
struct {
108109
TypeBase *FirstType;
109-
TypeBase * SecondType;
110+
TypeBase *SecondType;
110111
} Bind;
111112

112113
/// For ChangeKind::OpenedTypes.
@@ -187,6 +188,10 @@ class PreparedOverload final :
187188

188189
struct PreparedOverloadBuilder {
189190
SmallVector<PreparedOverload::Change, 8> Changes;
191+
ConstraintLocator *Locator;
192+
193+
PreparedOverloadBuilder(ConstraintLocator *locator)
194+
: Locator(locator) {}
190195

191196
void addedTypeVariable(TypeVariableType *typeVar) {
192197
PreparedOverload::Change change;

lib/Sema/CSSimplify.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

lib/Sema/TypeOfReference.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2811,7 +2811,8 @@ void ConstraintSystem::replayChanges(
28112811
addConstraint(ConstraintKind::Bind,
28122812
change.Bind.FirstType,
28132813
change.Bind.SecondType,
2814-
locator, /*isFavored=*/false);
2814+
locator,
2815+
/*isFavored=*/false);
28152816
break;
28162817

28172818
case PreparedOverload::Change::OpenedTypes: {
@@ -2890,7 +2891,7 @@ PreparedOverload *ConstraintSystem::prepareOverload(OverloadChoice choice,
28902891
ASSERT(!PreparingOverload);
28912892
PreparingOverload = true;
28922893

2893-
PreparedOverloadBuilder builder;
2894+
PreparedOverloadBuilder builder(locator);
28942895
Type openedType;
28952896
Type thrownErrorType;
28962897
std::tie(openedType, thrownErrorType) = prepareOverloadImpl(

0 commit comments

Comments
 (0)