@@ -1116,17 +1116,39 @@ bool isConditionOfStmt(ConstraintLocatorBuilder locator) {
11161116
11171117ConstraintSystem::SolutionKind
11181118ConstraintSystem::simplifySyntacticElementConstraint (
1119- ASTNode element, ContextualTypeInfo context , bool isDiscarded,
1119+ ASTNode element, ContextualTypeInfo contextInfo , bool isDiscarded,
11201120 TypeMatchOptions flags, ConstraintLocatorBuilder locator) {
1121- auto *closure = castToExpr<ClosureExpr>(locator.getAnchor ());
11221121
1123- SyntacticElementConstraintGenerator generator (
1124- *this , closure, getClosureType (closure)->getResult (),
1125- getConstraintLocator (locator));
1122+ DeclContext *context;
1123+ Type resultType;
1124+
1125+ auto anchor = locator.getAnchor ();
1126+
1127+ if (auto *closure = getAsExpr<ClosureExpr>(anchor)) {
1128+ context = closure;
1129+ resultType = getClosureType (closure)->getResult ();
1130+ } else if (auto *fn = getAsDecl<AbstractFunctionDecl>(anchor)) {
1131+ context = fn;
1132+ resultType = AnyFunctionRef (fn).getBodyResultType ();
1133+ } else {
1134+ return SolutionKind::Error;
1135+ }
1136+
1137+ AnyFunctionRef fn = AnyFunctionRef::fromFunctionDeclContext (context);
1138+
1139+ // If this element belongs to a result builder, let's use its result type.
1140+ {
1141+ auto transform = resultBuilderTransformed.find (fn);
1142+ if (transform != resultBuilderTransformed.end ())
1143+ resultType = transform->second .bodyResultType ;
1144+ }
1145+
1146+ SyntacticElementConstraintGenerator generator (*this , fn, resultType,
1147+ getConstraintLocator (locator));
11261148
11271149 if (auto *expr = element.dyn_cast <Expr *>()) {
1128- SolutionApplicationTarget target (expr, closure, context .purpose ,
1129- context .getType (), isDiscarded);
1150+ SolutionApplicationTarget target (expr, context, contextInfo .purpose ,
1151+ contextInfo .getType (), isDiscarded);
11301152
11311153 if (generateConstraints (target, FreeTypeVariableBinding::Disallow))
11321154 return SolutionKind::Error;
@@ -1136,12 +1158,12 @@ ConstraintSystem::simplifySyntacticElementConstraint(
11361158 } else if (auto *stmt = element.dyn_cast <Stmt *>()) {
11371159 generator.visit (stmt);
11381160 } else if (auto *cond = element.dyn_cast <StmtConditionElement *>()) {
1139- if (generateConstraints ({*cond}, closure ))
1161+ if (generateConstraints ({*cond}, context ))
11401162 return SolutionKind::Error;
11411163 } else if (auto *pattern = element.dyn_cast <Pattern *>()) {
1142- generator.visitPattern (pattern, context );
1164+ generator.visitPattern (pattern, contextInfo );
11431165 } else if (auto *caseItem = element.dyn_cast <CaseLabelItem *>()) {
1144- generator.visitCaseItem (caseItem, context );
1166+ generator.visitCaseItem (caseItem, contextInfo );
11451167 } else {
11461168 generator.visit (element.get <Decl *>());
11471169 }
0 commit comments