Skip to content

Commit 0518b76

Browse files
committed
Sema: Record pack environments in the trail
1 parent f51bf3c commit 0518b76

File tree

5 files changed

+40
-15
lines changed

5 files changed

+40
-15
lines changed

include/swift/Sema/CSTrail.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ class SolverTrail {
7373
RecordedOpenedPackExpansionType,
7474
/// Recorded the creation of a generic environment for a pack expansion expression.
7575
RecordedPackExpansionEnvironment,
76+
/// Recorded the mapping from a pack element expression to its parent
77+
/// pack expansion expression.
78+
RecordedPackEnvironment,
7679
};
7780

7881
/// A change made to the constraint system.
@@ -139,6 +142,7 @@ class SolverTrail {
139142

140143
ConstraintLocator *Locator;
141144
PackExpansionType *ExpansionTy;
145+
PackElementExpr *ElementExpr;
142146
};
143147

144148
Change() : Kind(ChangeKind::AddedTypeVariable), TypeVar(nullptr) { }
@@ -208,6 +212,10 @@ class SolverTrail {
208212
/// Create a change that recorded the opening of a pack expansion type.
209213
static Change recordedPackExpansionEnvironment(ConstraintLocator *locator);
210214

215+
/// Create a change that recorded a mapping from a pack element expression
216+
/// to its parent expansion expression.
217+
static Change recordedPackEnvironment(PackElementExpr *packElement);
218+
211219
/// Undo this change, reverting the constraint graph to the state it
212220
/// had prior to this change.
213221
///

include/swift/Sema/ConstraintSystem.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,7 +1546,7 @@ class Solution {
15461546
PackExpansionEnvironments;
15471547

15481548
/// The pack expansion environment that can open a given pack element.
1549-
llvm::MapVector<PackElementExpr *, PackExpansionExpr *>
1549+
llvm::DenseMap<PackElementExpr *, PackExpansionExpr *>
15501550
PackEnvironments;
15511551

15521552
/// The outer pack element generic environment to use when dealing with nested
@@ -2400,7 +2400,7 @@ class ConstraintSystem {
24002400
llvm::SmallDenseMap<ConstraintLocator *, std::pair<UUID, Type>, 4>
24012401
PackExpansionEnvironments;
24022402

2403-
llvm::SmallMapVector<PackElementExpr *, PackExpansionExpr *, 2>
2403+
llvm::SmallDenseMap<PackElementExpr *, PackExpansionExpr *, 2>
24042404
PackEnvironments;
24052405

24062406
llvm::SmallVector<GenericEnvironment *, 4> PackElementGenericEnvironments;
@@ -2883,9 +2883,6 @@ class ConstraintSystem {
28832883
/// FIXME: Remove this.
28842884
unsigned numFixes;
28852885

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

@@ -3474,10 +3471,17 @@ class ConstraintSystem {
34743471
/// Get the opened element generic environment for the given pack element.
34753472
PackExpansionExpr *getPackEnvironment(PackElementExpr *packElement) const;
34763473

3477-
/// Associate an opened element generic environment to a pack element.
3474+
/// Associate an opened element generic environment to a pack element,
3475+
/// and record a change in the trail.
34783476
void addPackEnvironment(PackElementExpr *packElement,
34793477
PackExpansionExpr *packExpansion);
34803478

3479+
/// Undo the above change.
3480+
void removePackEnvironment(PackElementExpr *packElement) {
3481+
bool erased = PackEnvironments.erase(packElement);
3482+
ASSERT(erased);
3483+
}
3484+
34813485
/// Retrieve the constraint locator for the given anchor and
34823486
/// path, uniqued and automatically infer the summary flags
34833487
ConstraintLocator *

lib/Sema/CSSolver.cpp

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

347347
// Register the solutions's pack environments.
348348
for (auto &packEnvironment : solution.PackEnvironments) {
349-
PackEnvironments.insert(packEnvironment);
349+
addPackEnvironment(packEnvironment.first, packEnvironment.second);
350350
}
351351

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

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

733-
// Remove any pack environments.
734-
truncate(cs.PackEnvironments, numPackEnvironments);
735-
736732
// Remove any pack element generic environments.
737733
truncate(cs.PackElementGenericEnvironments,
738734
numPackElementGenericEnvironments);

lib/Sema/CSTrail.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,14 @@ SolverTrail::Change::recordedPackExpansionEnvironment(ConstraintLocator *locator
209209
return result;
210210
}
211211

212+
SolverTrail::Change
213+
SolverTrail::Change::recordedPackEnvironment(PackElementExpr *packElement) {
214+
Change result;
215+
result.Kind = ChangeKind::RecordedPackEnvironment;
216+
result.ElementExpr = packElement;
217+
return result;
218+
}
219+
212220
void SolverTrail::Change::undo(ConstraintSystem &cs) const {
213221
auto &cg = cs.getConstraintGraph();
214222

@@ -289,6 +297,10 @@ void SolverTrail::Change::undo(ConstraintSystem &cs) const {
289297
case ChangeKind::RecordedPackExpansionEnvironment:
290298
cs.removePackExpansionEnvironment(Locator);
291299
break;
300+
301+
case ChangeKind::RecordedPackEnvironment:
302+
cs.removePackEnvironment(ElementExpr);
303+
break;
292304
}
293305
}
294306

@@ -442,6 +454,10 @@ void SolverTrail::Change::dump(llvm::raw_ostream &out,
442454
Locator->dump(&cs.getASTContext().SourceMgr, out);
443455
out << ")\n";
444456
break;
457+
458+
case ChangeKind::RecordedPackEnvironment:
459+
out << "(recorded pack environment)\n";
460+
break;
445461
}
446462
}
447463

lib/Sema/ConstraintSystem.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -910,11 +910,12 @@ ConstraintSystem::getPackEnvironment(PackElementExpr *packElement) const {
910910

911911
void ConstraintSystem::addPackEnvironment(PackElementExpr *packElement,
912912
PackExpansionExpr *packExpansion) {
913-
assert(packElement);
914-
assert(packExpansion);
915-
[[maybe_unused]] const auto inserted =
913+
bool inserted =
916914
PackEnvironments.insert({packElement, packExpansion}).second;
917-
assert(inserted && "Mapping already defined?");
915+
if (inserted) {
916+
if (isRecordingChanges())
917+
recordChange(SolverTrail::Change::recordedPackEnvironment(packElement));
918+
}
918919
}
919920

920921
/// Extend the given depth map by adding depths for all of the subexpressions

0 commit comments

Comments
 (0)