Skip to content

Commit 4442d1c

Browse files
authored
Merge pull request #61452 from xedin/rework-bool-pattern-cond-handling-in-closures
[CSGen/CSApply] A couple of cleanups to statement condition handling
2 parents b0fd4c3 + e696b75 commit 4442d1c

File tree

2 files changed

+10
-22
lines changed

2 files changed

+10
-22
lines changed

lib/Sema/CSApply.cpp

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8965,13 +8965,14 @@ ExprWalker::rewriteTarget(SolutionApplicationTarget target) {
89658965
break;
89668966
}
89678967
} else if (auto stmtCondition = target.getAsStmtCondition()) {
8968+
auto &cs = solution.getConstraintSystem();
8969+
89688970
for (auto &condElement : *stmtCondition) {
89698971
switch (condElement.getKind()) {
89708972
case StmtConditionElement::CK_Availability:
89718973
continue;
89728974

89738975
case StmtConditionElement::CK_HasSymbol: {
8974-
ConstraintSystem &cs = solution.getConstraintSystem();
89758976
auto info = condElement.getHasSymbolInfo();
89768977
auto target = *cs.getSolutionApplicationTarget(&condElement);
89778978
auto resolvedTarget = rewriteTarget(target);
@@ -8988,30 +8989,21 @@ ExprWalker::rewriteTarget(SolutionApplicationTarget target) {
89888989
}
89898990

89908991
case StmtConditionElement::CK_Boolean: {
8991-
auto condExpr = condElement.getBoolean();
8992-
auto finalCondExpr = condExpr->walk(*this);
8993-
if (!finalCondExpr)
8992+
auto target = *cs.getSolutionApplicationTarget(&condElement);
8993+
auto resolvedTarget = rewriteTarget(target);
8994+
if (!resolvedTarget)
89948995
return None;
89958996

8996-
// Load the condition if needed.
8997-
solution.setExprTypes(finalCondExpr);
8998-
if (finalCondExpr->getType()->hasLValueType()) {
8999-
ASTContext &ctx = solution.getConstraintSystem().getASTContext();
9000-
finalCondExpr = TypeChecker::addImplicitLoadExpr(ctx, finalCondExpr);
9001-
}
9002-
9003-
condElement.setBoolean(finalCondExpr);
8997+
condElement.setBoolean(resolvedTarget->getAsExpr());
90048998
continue;
90058999
}
90069000

90079001
case StmtConditionElement::CK_PatternBinding: {
9008-
ConstraintSystem &cs = solution.getConstraintSystem();
90099002
auto target = *cs.getSolutionApplicationTarget(&condElement);
90109003
auto resolvedTarget = rewriteTarget(target);
90119004
if (!resolvedTarget)
90129005
return None;
90139006

9014-
solution.setExprTypes(resolvedTarget->getAsExpr());
90159007
condElement.setInitializer(resolvedTarget->getAsExpr());
90169008
condElement.setPattern(resolvedTarget->getInitializationPattern());
90179009
continue;

lib/Sema/CSGen.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4382,17 +4382,13 @@ bool ConstraintSystem::generateConstraints(StmtCondition condition,
43824382

43834383
case StmtConditionElement::CK_Boolean: {
43844384
Expr *condExpr = condElement.getBoolean();
4385-
setContextualType(condExpr, TypeLoc::withoutLoc(boolTy), CTP_Condition);
4385+
auto target = SolutionApplicationTarget(condExpr, dc, CTP_Condition,
4386+
boolTy, /*isDiscarded=*/false);
43864387

4387-
condExpr = generateConstraints(condExpr, dc);
4388-
if (!condExpr) {
4388+
if (generateConstraints(target, FreeTypeVariableBinding::Disallow))
43894389
return true;
4390-
}
43914390

4392-
addConstraint(
4393-
ConstraintKind::Conversion, getType(condExpr), boolTy,
4394-
getConstraintLocator(condExpr,
4395-
LocatorPathElt::ContextualType(CTP_Condition)));
4391+
setSolutionApplicationTarget(&condElement, target);
43964392
continue;
43974393
}
43984394

0 commit comments

Comments
 (0)