Skip to content

Commit f51bf3c

Browse files
committed
Sema: Record pack expansion environments in the trail
1 parent 9afb1a9 commit f51bf3c

File tree

5 files changed

+47
-10
lines changed

5 files changed

+47
-10
lines changed

include/swift/Sema/CSTrail.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ class SolverTrail {
7171
RecordedOpenedExistentialType,
7272
/// Recorded the opening of a pack existential type.
7373
RecordedOpenedPackExpansionType,
74+
/// Recorded the creation of a generic environment for a pack expansion expression.
75+
RecordedPackExpansionEnvironment,
7476
};
7577

7678
/// A change made to the constraint system.
@@ -203,6 +205,9 @@ class SolverTrail {
203205
/// Create a change that recorded the opening of a pack expansion type.
204206
static Change recordedOpenedPackExpansionType(PackExpansionType *expansion);
205207

208+
/// Create a change that recorded the opening of a pack expansion type.
209+
static Change recordedPackExpansionEnvironment(ConstraintLocator *locator);
210+
206211
/// Undo this change, reverting the constraint graph to the state it
207212
/// had prior to this change.
208213
///

include/swift/Sema/ConstraintSystem.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2397,7 +2397,7 @@ class ConstraintSystem {
23972397
llvm::SmallDenseMap<PackExpansionType *, TypeVariableType *, 4>
23982398
OpenedPackExpansionTypes;
23992399

2400-
llvm::SmallMapVector<ConstraintLocator *, std::pair<UUID, Type>, 4>
2400+
llvm::SmallDenseMap<ConstraintLocator *, std::pair<UUID, Type>, 4>
24012401
PackExpansionEnvironments;
24022402

24032403
llvm::SmallMapVector<PackElementExpr *, PackExpansionExpr *, 2>
@@ -2883,9 +2883,6 @@ class ConstraintSystem {
28832883
/// FIXME: Remove this.
28842884
unsigned numFixes;
28852885

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

@@ -3464,6 +3461,16 @@ class ConstraintSystem {
34643461
GenericEnvironment *getPackElementEnvironment(ConstraintLocator *locator,
34653462
CanType shapeClass);
34663463

3464+
/// Update PackExpansionEnvironments and record a change in the trail.
3465+
void recordPackExpansionEnvironment(ConstraintLocator *locator,
3466+
std::pair<UUID, Type> uuidAndShape);
3467+
3468+
/// Undo the above change.
3469+
void removePackExpansionEnvironment(ConstraintLocator *locator) {
3470+
bool erased = PackExpansionEnvironments.erase(locator);
3471+
ASSERT(erased);
3472+
}
3473+
34673474
/// Get the opened element generic environment for the given pack element.
34683475
PackExpansionExpr *getPackEnvironment(PackElementExpr *packElement) const;
34693476

lib/Sema/CSSolver.cpp

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

342342
// Register the solutions's pack expansion environments.
343343
for (const auto &expansion : solution.PackExpansionEnvironments) {
344-
PackExpansionEnvironments.insert(expansion);
344+
recordPackExpansionEnvironment(expansion.first, expansion.second);
345345
}
346346

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

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

734-
// Remove any pack expansion environments.
735-
truncate(cs.PackExpansionEnvironments, numPackExpansionEnvironments);
736-
737733
// Remove any pack environments.
738734
truncate(cs.PackEnvironments, numPackEnvironments);
739735

lib/Sema/CSTrail.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,14 @@ SolverTrail::Change::recordedOpenedPackExpansionType(PackExpansionType *expansio
201201
return result;
202202
}
203203

204+
SolverTrail::Change
205+
SolverTrail::Change::recordedPackExpansionEnvironment(ConstraintLocator *locator) {
206+
Change result;
207+
result.Kind = ChangeKind::RecordedPackExpansionEnvironment;
208+
result.Locator = locator;
209+
return result;
210+
}
211+
204212
void SolverTrail::Change::undo(ConstraintSystem &cs) const {
205213
auto &cg = cs.getConstraintGraph();
206214

@@ -277,6 +285,10 @@ void SolverTrail::Change::undo(ConstraintSystem &cs) const {
277285
case ChangeKind::RecordedOpenedPackExpansionType:
278286
cs.removeOpenedPackExpansionType(ExpansionTy);
279287
break;
288+
289+
case ChangeKind::RecordedPackExpansionEnvironment:
290+
cs.removePackExpansionEnvironment(Locator);
291+
break;
280292
}
281293
}
282294

@@ -424,6 +436,12 @@ void SolverTrail::Change::dump(llvm::raw_ostream &out,
424436
ExpansionTy->print(out, PO);
425437
out << ")\n";
426438
break;
439+
440+
case ChangeKind::RecordedPackExpansionEnvironment:
441+
out << "(recorded pack expansion environment at ";
442+
Locator->dump(&cs.getASTContext().SourceMgr, out);
443+
out << ")\n";
444+
break;
427445
}
428446
}
429447

lib/Sema/ConstraintSystem.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -868,7 +868,7 @@ ConstraintSystem::getPackElementEnvironment(ConstraintLocator *locator,
868868
auto result = PackExpansionEnvironments.find(locator);
869869
if (result == PackExpansionEnvironments.end()) {
870870
uuidAndShape = std::make_pair(UUID::fromTime(), shapeClass);
871-
PackExpansionEnvironments[locator] = uuidAndShape;
871+
recordPackExpansionEnvironment(locator, uuidAndShape);
872872
} else {
873873
uuidAndShape = result->second;
874874
}
@@ -891,6 +891,17 @@ ConstraintSystem::getPackElementEnvironment(ConstraintLocator *locator,
891891
shapeParam, contextSubs);
892892
}
893893

894+
void ConstraintSystem::recordPackExpansionEnvironment(
895+
ConstraintLocator *locator, std::pair<UUID, Type> uuidAndShape) {
896+
bool inserted = PackExpansionEnvironments.insert({locator, uuidAndShape}).second;
897+
if (inserted) {
898+
if (isRecordingChanges()) {
899+
recordChange(
900+
SolverTrail::Change::recordedPackExpansionEnvironment(locator));
901+
}
902+
}
903+
}
904+
894905
PackExpansionExpr *
895906
ConstraintSystem::getPackEnvironment(PackElementExpr *packElement) const {
896907
const auto match = PackEnvironments.find(packElement);

0 commit comments

Comments
 (0)