Skip to content

Commit 77d4134

Browse files
authored
Merge pull request #32221 from DougGregor/stmt-typecheck-cleanups
[Constraint system] Lift PatternBindingDecl into SolutionApplicationTarget
2 parents 164ebbf + f1febc2 commit 77d4134

File tree

4 files changed

+235
-33
lines changed

4 files changed

+235
-33
lines changed

lib/Sema/BuilderTransform.cpp

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -269,26 +269,12 @@ class BuilderClosureVisitor
269269
return;
270270
}
271271

272-
// If we aren't generating constraints, there's nothing to do.
273-
if (!cs)
274-
return;
275-
276-
/// Generate constraints for each pattern binding entry
277-
for (unsigned index : range(patternBinding->getNumPatternEntries())) {
278-
// Type check the pattern.
279-
auto pattern = patternBinding->getPattern(index);
280-
auto contextualPattern = ContextualPattern::forRawPattern(pattern, dc);
281-
Type patternType = TypeChecker::typeCheckPattern(contextualPattern);
282-
283-
// Generate constraints for the initialization.
284-
auto target = SolutionApplicationTarget::forInitialization(
285-
patternBinding->getInit(index), dc, patternType, pattern,
286-
/*bindPatternVarsOneWay=*/true);
272+
// If there is a constraint system, generate constraints for the pattern
273+
// binding.
274+
if (cs) {
275+
SolutionApplicationTarget target(patternBinding);
287276
if (cs->generateConstraints(target, FreeTypeVariableBinding::Disallow))
288-
continue;
289-
290-
// Keep track of this binding entry.
291-
applied.patternBindingEntries.insert({{patternBinding, index}, target});
277+
hadError = true;
292278
}
293279
}
294280

@@ -1035,11 +1021,11 @@ class BuilderClosureRewriter
10351021
for (unsigned index : range(patternBinding->getNumPatternEntries())) {
10361022
// Find the solution application target for this.
10371023
auto knownTarget =
1038-
builderTransform.patternBindingEntries.find({patternBinding, index});
1039-
assert(knownTarget != builderTransform.patternBindingEntries.end());
1024+
*solution.getConstraintSystem().getSolutionApplicationTarget(
1025+
{patternBinding, index});
10401026

10411027
// Rewrite the target.
1042-
auto resultTarget = rewriteTarget(knownTarget->second);
1028+
auto resultTarget = rewriteTarget(knownTarget);
10431029
if (!resultTarget)
10441030
continue;
10451031

lib/Sema/CSApply.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8103,6 +8103,25 @@ ExprWalker::rewriteTarget(SolutionApplicationTarget target) {
81038103
solution.setExprTypes(guardExpr);
81048104
}
81058105

8106+
return target;
8107+
} else if (auto patternBinding = target.getAsPatternBinding()) {
8108+
ConstraintSystem &cs = solution.getConstraintSystem();
8109+
for (unsigned index : range(patternBinding->getNumPatternEntries())) {
8110+
// Find the solution application target for this.
8111+
auto knownTarget = *cs.getSolutionApplicationTarget(
8112+
{patternBinding, index});
8113+
8114+
// Rewrite the target.
8115+
auto resultTarget = rewriteTarget(knownTarget);
8116+
if (!resultTarget)
8117+
return None;
8118+
8119+
patternBinding->setPattern(
8120+
index, resultTarget->getInitializationPattern(),
8121+
resultTarget->getDeclContext());
8122+
patternBinding->setInit(index, resultTarget->getAsExpr());
8123+
}
8124+
81068125
return target;
81078126
} else {
81088127
auto fn = *target.getAsFunction();
@@ -8380,6 +8399,10 @@ SolutionApplicationTarget SolutionApplicationTarget::walk(ASTWalker &walker) {
83808399
}
83818400

83828401
return *this;
8402+
8403+
case Kind::patternBinding:
8404+
return *this;
83838405
}
8406+
83848407
llvm_unreachable("invalid target kind");
83858408
}

lib/Sema/CSGen.cpp

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4428,7 +4428,48 @@ bool ConstraintSystem::generateConstraints(
44284428
return false;
44294429
}
44304430

4431-
llvm_unreachable("BOOM");
4431+
switch (target.kind) {
4432+
case SolutionApplicationTarget::Kind::expression:
4433+
llvm_unreachable("Handled above");
4434+
4435+
case SolutionApplicationTarget::Kind::caseLabelItem:
4436+
case SolutionApplicationTarget::Kind::function:
4437+
case SolutionApplicationTarget::Kind::stmtCondition:
4438+
llvm_unreachable("Handled separately");
4439+
4440+
case SolutionApplicationTarget::Kind::patternBinding: {
4441+
auto patternBinding = target.getAsPatternBinding();
4442+
auto dc = target.getDeclContext();
4443+
bool hadError = false;
4444+
4445+
/// Generate constraints for each pattern binding entry
4446+
for (unsigned index : range(patternBinding->getNumPatternEntries())) {
4447+
// Type check the pattern.
4448+
auto pattern = patternBinding->getPattern(index);
4449+
auto contextualPattern = ContextualPattern::forRawPattern(pattern, dc);
4450+
Type patternType = TypeChecker::typeCheckPattern(contextualPattern);
4451+
4452+
auto init = patternBinding->getInit(index);
4453+
if (!init) {
4454+
llvm_unreachable("Unsupported pattern binding entry");
4455+
}
4456+
4457+
// Generate constraints for the initialization.
4458+
auto target = SolutionApplicationTarget::forInitialization(
4459+
init, dc, patternType, pattern,
4460+
/*bindPatternVarsOneWay=*/true);
4461+
if (generateConstraints(target, FreeTypeVariableBinding::Disallow)) {
4462+
hadError = true;
4463+
continue;
4464+
}
4465+
4466+
// Keep track of this binding entry.
4467+
setSolutionApplicationTarget({patternBinding, index}, target);
4468+
}
4469+
4470+
return hadError;
4471+
}
4472+
}
44324473
}
44334474

44344475
Expr *ConstraintSystem::generateConstraints(

0 commit comments

Comments
 (0)