Skip to content

Commit 9afb1a9

Browse files
committed
Sema: Record opened pack expansion types in the trail
1 parent 7d3350d commit 9afb1a9

File tree

5 files changed

+45
-9
lines changed

5 files changed

+45
-9
lines changed

include/swift/Sema/CSTrail.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ class SolverTrail {
6969
RecordedOpenedTypes,
7070
/// Recorded the opening of an existential type at a locator.
7171
RecordedOpenedExistentialType,
72+
/// Recorded the opening of a pack existential type.
73+
RecordedOpenedPackExpansionType,
7274
};
7375

7476
/// A change made to the constraint system.
@@ -134,6 +136,7 @@ class SolverTrail {
134136
} FixedRequirement;
135137

136138
ConstraintLocator *Locator;
139+
PackExpansionType *ExpansionTy;
137140
};
138141

139142
Change() : Kind(ChangeKind::AddedTypeVariable), TypeVar(nullptr) { }
@@ -197,6 +200,9 @@ class SolverTrail {
197200
/// Create a change that recorded the opening of an existential type.
198201
static Change recordedOpenedExistentialType(ConstraintLocator *locator);
199202

203+
/// Create a change that recorded the opening of a pack expansion type.
204+
static Change recordedOpenedPackExpansionType(PackExpansionType *expansion);
205+
200206
/// Undo this change, reverting the constraint graph to the state it
201207
/// had prior to this change.
202208
///

include/swift/Sema/ConstraintSystem.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2394,7 +2394,7 @@ class ConstraintSystem {
23942394
llvm::SmallDenseMap<ConstraintLocator *, OpenedArchetypeType *, 4>
23952395
OpenedExistentialTypes;
23962396

2397-
llvm::SmallMapVector<PackExpansionType *, TypeVariableType *, 4>
2397+
llvm::SmallDenseMap<PackExpansionType *, TypeVariableType *, 4>
23982398
OpenedPackExpansionTypes;
23992399

24002400
llvm::SmallMapVector<ConstraintLocator *, std::pair<UUID, Type>, 4>
@@ -2883,9 +2883,6 @@ class ConstraintSystem {
28832883
/// FIXME: Remove this.
28842884
unsigned numFixes;
28852885

2886-
/// The length of \c OpenedPackExpansionsTypes.
2887-
unsigned numOpenedPackExpansionTypes;
2888-
28892886
/// The length of \c PackExpansionEnvironments.
28902887
unsigned numPackExpansionEnvironments;
28912888

@@ -4335,6 +4332,16 @@ class ConstraintSystem {
43354332
OpenedTypeMap &replacements,
43364333
ConstraintLocatorBuilder locator);
43374334

4335+
/// Update OpenedPackExpansionTypes and record a change in the trail.
4336+
void recordOpenedPackExpansionType(PackExpansionType *expansion,
4337+
TypeVariableType *expansionVar);
4338+
4339+
/// Undo the above change.
4340+
void removeOpenedPackExpansionType(PackExpansionType *expansion) {
4341+
bool erased = OpenedPackExpansionTypes.erase(expansion);
4342+
ASSERT(erased);
4343+
}
4344+
43384345
public:
43394346
/// Recurse over the given type and open any opaque archetype types.
43404347
Type openOpaqueType(Type type, ContextualTypePurpose context,

lib/Sema/CSSolver.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ void ConstraintSystem::applySolution(const Solution &solution) {
336336

337337
// Register the solution's opened pack expansion types.
338338
for (const auto &expansion : solution.OpenedPackExpansionTypes) {
339-
OpenedPackExpansionTypes.insert(expansion);
339+
recordOpenedPackExpansionType(expansion.first, expansion.second);
340340
}
341341

342342
// Register the solutions's pack expansion environments.
@@ -672,7 +672,6 @@ ConstraintSystem::SolverScope::SolverScope(ConstraintSystem &cs)
672672

673673
numTypeVariables = cs.TypeVariables.size();
674674
numFixes = cs.Fixes.size();
675-
numOpenedPackExpansionTypes = cs.OpenedPackExpansionTypes.size();
676675
numPackExpansionEnvironments = cs.PackExpansionEnvironments.size();
677676
numPackEnvironments = cs.PackEnvironments.size();
678677
numPackElementGenericEnvironments = cs.PackElementGenericEnvironments.size();
@@ -732,9 +731,6 @@ ConstraintSystem::SolverScope::~SolverScope() {
732731
// constraints introduced by the current scope.
733732
cs.solverState->rollback(this);
734733

735-
// Remove any opened pack expansion types.
736-
truncate(cs.OpenedPackExpansionTypes, numOpenedPackExpansionTypes);
737-
738734
// Remove any pack expansion environments.
739735
truncate(cs.PackExpansionEnvironments, numPackExpansionEnvironments);
740736

lib/Sema/CSTrail.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,14 @@ SolverTrail::Change::recordedOpenedExistentialType(ConstraintLocator *locator) {
193193
return result;
194194
}
195195

196+
SolverTrail::Change
197+
SolverTrail::Change::recordedOpenedPackExpansionType(PackExpansionType *expansionTy) {
198+
Change result;
199+
result.Kind = ChangeKind::RecordedOpenedPackExpansionType;
200+
result.ExpansionTy = expansionTy;
201+
return result;
202+
}
203+
196204
void SolverTrail::Change::undo(ConstraintSystem &cs) const {
197205
auto &cg = cs.getConstraintGraph();
198206

@@ -265,6 +273,10 @@ void SolverTrail::Change::undo(ConstraintSystem &cs) const {
265273
case ChangeKind::RecordedOpenedExistentialType:
266274
cs.removeOpenedExistentialType(Locator);
267275
break;
276+
277+
case ChangeKind::RecordedOpenedPackExpansionType:
278+
cs.removeOpenedPackExpansionType(ExpansionTy);
279+
break;
268280
}
269281
}
270282

@@ -406,6 +418,12 @@ void SolverTrail::Change::dump(llvm::raw_ostream &out,
406418
Locator->dump(&cs.getASTContext().SourceMgr, out);
407419
out << ")\n";
408420
break;
421+
422+
case ChangeKind::RecordedOpenedPackExpansionType:
423+
out << "(recorded opened pack expansion type for ";
424+
ExpansionTy->print(out, PO);
425+
out << ")\n";
426+
break;
409427
}
410428
}
411429

lib/Sema/ConstraintSystem.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,6 +1263,15 @@ Type ConstraintSystem::openPackExpansionType(PackExpansionType *expansion,
12631263
return expansionVar;
12641264
}
12651265

1266+
void ConstraintSystem::recordOpenedPackExpansionType(PackExpansionType *expansion,
1267+
TypeVariableType *expansionVar) {
1268+
bool inserted = OpenedPackExpansionTypes.insert({expansion, expansionVar}).second;
1269+
if (inserted) {
1270+
if (isRecordingChanges())
1271+
recordChange(SolverTrail::Change::recordedOpenedPackExpansionType(expansion));
1272+
}
1273+
}
1274+
12661275
Type ConstraintSystem::openOpaqueType(OpaqueTypeArchetypeType *opaque,
12671276
ConstraintLocatorBuilder locator) {
12681277
auto opaqueDecl = opaque->getDecl();

0 commit comments

Comments
 (0)