Skip to content

Commit b39d3ae

Browse files
committed
Sema: Special-case recording of Bind constraint in PreparedOverload
1 parent 6e212de commit b39d3ae

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

include/swift/Sema/PreparedOverload.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ struct PreparedOverloadChange {
7171
/// A generic requirement was opened to a constraint.
7272
AddedConstraint,
7373

74+
/// Special case of a Bind constraint.
75+
AddedBindConstraint,
76+
7477
/// A mapping of generic parameter types to type variables
7578
/// was recorded.
7679
OpenedTypes,
@@ -98,6 +101,11 @@ struct PreparedOverloadChange {
98101
/// For ChangeKind::AddedConstraint.
99102
Constraint *TheConstraint;
100103

104+
struct {
105+
TypeBase *FirstType;
106+
TypeBase * SecondType;
107+
} Bind;
108+
101109
/// For ChangeKind::OpenedTypes.
102110
struct {
103111
const OpenedType *Data;
@@ -192,6 +200,14 @@ struct PreparedOverloadBuilder {
192200
Changes.push_back(change);
193201
}
194202

203+
void addedBindConstraint(Type firstType, Type secondType) {
204+
PreparedOverload::Change change;
205+
change.Kind = PreparedOverload::Change::AddedBindConstraint;
206+
change.Bind.FirstType = firstType.getPointer();
207+
change.Bind.SecondType = secondType.getPointer();
208+
Changes.push_back(change);
209+
}
210+
195211
void openedTypes(ArrayRef<OpenedType> replacements) {
196212
PreparedOverload::Change change;
197213
change.Kind = PreparedOverload::Change::OpenedTypes;

lib/Sema/CSSimplify.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16365,6 +16365,11 @@ void ConstraintSystem::addConstraint(ConstraintKind kind, Type first,
1636516365
PreparedOverloadBuilder *preparedOverload) {
1636616366
if (preparedOverload) {
1636716367
ASSERT(PreparingOverload);
16368+
if (kind == ConstraintKind::Bind) {
16369+
ASSERT(!isFavored);
16370+
preparedOverload->addedBindConstraint(first, second);
16371+
return;
16372+
}
1636816373
auto c = Constraint::create(*this, kind, first, second,
1636916374
getConstraintLocator(locator));
1637016375
if (isFavored) c->setFavored();

lib/Sema/TypeOfReference.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2510,6 +2510,13 @@ void ConstraintSystem::replayChanges(
25102510
simplifyDisjunctionChoice(change.TheConstraint);
25112511
break;
25122512

2513+
case PreparedOverload::Change::AddedBindConstraint:
2514+
addConstraint(ConstraintKind::Bind,
2515+
change.Bind.FirstType,
2516+
change.Bind.SecondType,
2517+
locator, /*isFavored=*/false);
2518+
break;
2519+
25132520
case PreparedOverload::Change::OpenedTypes: {
25142521
ArrayRef<OpenedType> replacements(
25152522
change.Replacements.Data,

0 commit comments

Comments
 (0)