@@ -531,18 +531,23 @@ class ClosureConstraintGenerator
531531 " Unsupported statement: Fallthrough" );
532532 }
533533
534+ void visitStmtCondition (LabeledConditionalStmt *S,
535+ SmallVectorImpl<ElementInfo> &elements,
536+ ConstraintLocator *locator) {
537+ auto *condLocator =
538+ cs.getConstraintLocator (locator, ConstraintLocator::Condition);
539+ for (auto &condition : S->getCond ())
540+ elements.push_back (makeElement (&condition, condLocator));
541+ }
542+
534543 void visitIfStmt (IfStmt *ifStmt) {
535544 assert (isSupportedMultiStatementClosure () &&
536545 " Unsupported statement: If" );
537546
538547 SmallVector<ElementInfo, 4 > elements;
539548
540549 // Condition
541- {
542- auto *condLoc =
543- cs.getConstraintLocator (locator, ConstraintLocator::Condition);
544- elements.push_back (makeElement (ifStmt->getCondPointer (), condLoc));
545- }
550+ visitStmtCondition (ifStmt, elements, locator);
546551
547552 // Then Branch
548553 {
@@ -565,24 +570,24 @@ class ClosureConstraintGenerator
565570 assert (isSupportedMultiStatementClosure () &&
566571 " Unsupported statement: Guard" );
567572
568- createConjunction (cs,
569- { makeElement (guardStmt-> getCondPointer (),
570- cs. getConstraintLocator (
571- locator, ConstraintLocator::Condition)),
572- makeElement (guardStmt-> getBody (), locator)},
573- locator);
573+ SmallVector<ElementInfo, 4 > elements;
574+
575+ visitStmtCondition (guardStmt, elements, locator);
576+ elements. push_back ( makeElement (guardStmt-> getBody (), locator));
577+
578+ createConjunction (cs, elements, locator);
574579 }
575580
576581 void visitWhileStmt (WhileStmt *whileStmt) {
577582 assert (isSupportedMultiStatementClosure () &&
578583 " Unsupported statement: While" );
579584
580- createConjunction (cs,
581- { makeElement (whileStmt-> getCondPointer (),
582- cs. getConstraintLocator (
583- locator, ConstraintLocator::Condition)),
584- makeElement (whileStmt-> getBody (), locator)},
585- locator);
585+ SmallVector<ElementInfo, 4 > elements;
586+
587+ visitStmtCondition (whileStmt, elements, locator);
588+ elements. push_back ( makeElement (whileStmt-> getBody (), locator));
589+
590+ createConjunction (cs, elements, locator);
586591 }
587592
588593 void visitDoStmt (DoStmt *doStmt) {
@@ -970,8 +975,8 @@ ConstraintSystem::simplifyClosureBodyElementConstraint(
970975 return SolutionKind::Solved;
971976 } else if (auto *stmt = element.dyn_cast <Stmt *>()) {
972977 generator.visit (stmt);
973- } else if (auto *cond = element.dyn_cast <StmtCondition *>()) {
974- if (generateConstraints (*cond, closure))
978+ } else if (auto *cond = element.dyn_cast <StmtConditionElement *>()) {
979+ if (generateConstraints ({ *cond} , closure))
975980 return SolutionKind::Error;
976981 } else if (auto *pattern = element.dyn_cast <Pattern *>()) {
977982 generator.visitPattern (pattern, context);
@@ -1571,7 +1576,7 @@ void ConjunctionElement::findReferencedVariables(
15711576
15721577 TypeVariableRefFinder refFinder (cs, locator->getAnchor (), typeVars);
15731578
1574- if (element.is <Decl *>() || element.is <StmtCondition *>() ||
1579+ if (element.is <Decl *>() || element.is <StmtConditionElement *>() ||
15751580 element.is <Expr *>() || element.isStmt (StmtKind::Return))
15761581 element.walk (refFinder);
15771582}
0 commit comments