Skip to content

Commit ab72407

Browse files
committed
Sema: Collect opened pack expansion types in PreparedOverload
1 parent c5741e3 commit ab72407

File tree

3 files changed

+42
-12
lines changed

3 files changed

+42
-12
lines changed

include/swift/Sema/ConstraintSystem.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4360,7 +4360,9 @@ class ConstraintSystem {
43604360

43614361
/// Update OpenedPackExpansionTypes and record a change in the trail.
43624362
void recordOpenedPackExpansionType(PackExpansionType *expansion,
4363-
TypeVariableType *expansionVar);
4363+
TypeVariableType *expansionVar,
4364+
PreparedOverload *preparedOverload
4365+
= nullptr);
43644366

43654367
/// Undo the above change.
43664368
void removeOpenedPackExpansionType(PackExpansionType *expansion) {

include/swift/Sema/PreparedOverload.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ struct PreparedOverload {
3535
SmallVector<Constraint *, 2> Constraints;
3636
SmallVector<OpenedType, 2> Replacements;
3737
ExistentialArchetypeType *OpenedExistential = nullptr;
38+
SmallVector<std::pair<PackExpansionType *, TypeVariableType *>>
39+
OpenedPackExpansionTypes;
3840

3941
void discharge(ConstraintSystem &cs, ConstraintLocatorBuilder locator) const;
4042
};

lib/Sema/TypeOfReference.cpp

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -314,31 +314,54 @@ Type ConstraintSystem::openPackExpansionType(PackExpansionType *expansion,
314314

315315
auto openedPackExpansion = PackExpansionType::get(patternType, shapeType);
316316

317-
auto known = OpenedPackExpansionTypes.find(openedPackExpansion);
318-
if (known != OpenedPackExpansionTypes.end())
319-
return known->second;
317+
// FIXME: It's silly that we need to do this. The whole concept of
318+
// "opening" pack expansions is broken.
319+
{
320+
if (preparedOverload) {
321+
for (auto pair : preparedOverload->OpenedPackExpansionTypes) {
322+
if (pair.first == openedPackExpansion)
323+
return pair.second;
324+
}
325+
}
326+
327+
auto known = OpenedPackExpansionTypes.find(openedPackExpansion);
328+
if (known != OpenedPackExpansionTypes.end())
329+
return known->second;
330+
}
320331

321332
auto *expansionLoc = getConstraintLocator(locator.withPathElement(
322333
LocatorPathElt::PackExpansionType(openedPackExpansion)));
323334

324335
auto *expansionVar = createTypeVariable(expansionLoc, TVO_PackExpansion,
325336
preparedOverload);
326337

327-
ASSERT(!preparedOverload && "Implement below");
328-
329338
// This constraint is important to make sure that pack expansion always
330339
// has a binding and connect pack expansion var to any type variables
331340
// that appear in pattern and shape types.
332-
addUnsolvedConstraint(Constraint::create(*this, ConstraintKind::FallbackType,
333-
expansionVar, openedPackExpansion,
334-
expansionLoc));
335-
336-
recordOpenedPackExpansionType(openedPackExpansion, expansionVar);
341+
auto *c = Constraint::create(*this, ConstraintKind::FallbackType,
342+
expansionVar, openedPackExpansion,
343+
expansionLoc);
344+
if (preparedOverload)
345+
preparedOverload->Constraints.push_back(c);
346+
else
347+
addUnsolvedConstraint(c);
348+
349+
recordOpenedPackExpansionType(openedPackExpansion, expansionVar,
350+
preparedOverload);
337351
return expansionVar;
338352
}
339353

340354
void ConstraintSystem::recordOpenedPackExpansionType(PackExpansionType *expansion,
341-
TypeVariableType *expansionVar) {
355+
TypeVariableType *expansionVar,
356+
PreparedOverload *preparedOverload) {
357+
if (preparedOverload) {
358+
ASSERT(PreparingOverload);
359+
preparedOverload->OpenedPackExpansionTypes.push_back({expansion, expansionVar});
360+
return;
361+
}
362+
363+
ASSERT(!PreparingOverload);
364+
342365
bool inserted = OpenedPackExpansionTypes.insert({expansion, expansionVar}).second;
343366
ASSERT(inserted);
344367

@@ -2476,6 +2499,9 @@ void PreparedOverload::discharge(ConstraintSystem &cs,
24762499
cs.recordOpenedExistentialType(cs.getConstraintLocator(locator),
24772500
OpenedExistential);
24782501
}
2502+
for (auto pair : OpenedPackExpansionTypes) {
2503+
cs.recordOpenedPackExpansionType(pair.first, pair.second);
2504+
}
24792505
}
24802506

24812507
void ConstraintSystem::resolveOverload(ConstraintLocator *locator,

0 commit comments

Comments
 (0)