Sema: Special-case recording of Bind constraint in PreparedOverload

This commit is contained in:
Slava Pestov
2025-07-11 17:13:28 -04:00
parent 6e212de774
commit b39d3aee57
3 changed files with 28 additions and 0 deletions

View File

@@ -71,6 +71,9 @@ struct PreparedOverloadChange {
/// A generic requirement was opened to a constraint. /// A generic requirement was opened to a constraint.
AddedConstraint, AddedConstraint,
/// Special case of a Bind constraint.
AddedBindConstraint,
/// A mapping of generic parameter types to type variables /// A mapping of generic parameter types to type variables
/// was recorded. /// was recorded.
OpenedTypes, OpenedTypes,
@@ -98,6 +101,11 @@ struct PreparedOverloadChange {
/// For ChangeKind::AddedConstraint. /// For ChangeKind::AddedConstraint.
Constraint *TheConstraint; Constraint *TheConstraint;
struct {
TypeBase *FirstType;
TypeBase * SecondType;
} Bind;
/// For ChangeKind::OpenedTypes. /// For ChangeKind::OpenedTypes.
struct { struct {
const OpenedType *Data; const OpenedType *Data;
@@ -192,6 +200,14 @@ struct PreparedOverloadBuilder {
Changes.push_back(change); Changes.push_back(change);
} }
void addedBindConstraint(Type firstType, Type secondType) {
PreparedOverload::Change change;
change.Kind = PreparedOverload::Change::AddedBindConstraint;
change.Bind.FirstType = firstType.getPointer();
change.Bind.SecondType = secondType.getPointer();
Changes.push_back(change);
}
void openedTypes(ArrayRef<OpenedType> replacements) { void openedTypes(ArrayRef<OpenedType> replacements) {
PreparedOverload::Change change; PreparedOverload::Change change;
change.Kind = PreparedOverload::Change::OpenedTypes; change.Kind = PreparedOverload::Change::OpenedTypes;

View File

@@ -16365,6 +16365,11 @@ void ConstraintSystem::addConstraint(ConstraintKind kind, Type first,
PreparedOverloadBuilder *preparedOverload) { PreparedOverloadBuilder *preparedOverload) {
if (preparedOverload) { if (preparedOverload) {
ASSERT(PreparingOverload); ASSERT(PreparingOverload);
if (kind == ConstraintKind::Bind) {
ASSERT(!isFavored);
preparedOverload->addedBindConstraint(first, second);
return;
}
auto c = Constraint::create(*this, kind, first, second, auto c = Constraint::create(*this, kind, first, second,
getConstraintLocator(locator)); getConstraintLocator(locator));
if (isFavored) c->setFavored(); if (isFavored) c->setFavored();

View File

@@ -2510,6 +2510,13 @@ void ConstraintSystem::replayChanges(
simplifyDisjunctionChoice(change.TheConstraint); simplifyDisjunctionChoice(change.TheConstraint);
break; break;
case PreparedOverload::Change::AddedBindConstraint:
addConstraint(ConstraintKind::Bind,
change.Bind.FirstType,
change.Bind.SecondType,
locator, /*isFavored=*/false);
break;
case PreparedOverload::Change::OpenedTypes: { case PreparedOverload::Change::OpenedTypes: {
ArrayRef<OpenedType> replacements( ArrayRef<OpenedType> replacements(
change.Replacements.Data, change.Replacements.Data,