[CS] Diagnose UnresolvedPatternExprs as part of constraint solving

Instead of diagnosing in CSApply, let's create a
fix and diagnose in the solver instead.
Additionally, make sure we assign ErrorTypes to
any VarDecls bound by the invalid pattern, which
fixes a crash.

rdar://110638279
This commit is contained in:
Hamish Knight
2023-06-13 12:14:25 +01:00
parent 762cd4d10e
commit c6dd3ad839
10 changed files with 118 additions and 29 deletions

View File

@@ -4604,24 +4604,11 @@ namespace {
Expr *visitDiscardAssignmentExpr(DiscardAssignmentExpr *expr) {
return simplifyExprType(expr);
}
Expr *visitUnresolvedPatternExpr(UnresolvedPatternExpr *expr) {
// If we end up here, we should have diagnosed somewhere else
// already.
Expr *simplified = simplifyExprType(expr);
// Invalidate 'VarDecl's inside the pattern.
expr->getSubPattern()->forEachVariable([](VarDecl *VD) {
VD->setInvalid();
});
if (!SuppressDiagnostics
&& !cs.getType(simplified)->is<UnresolvedType>()) {
auto &de = cs.getASTContext().Diags;
de.diagnose(simplified->getLoc(), diag::pattern_in_expr,
expr->getSubPattern()->getDescriptiveKind());
}
return simplified;
llvm_unreachable("Should have diagnosed");
}
Expr *visitBindOptionalExpr(BindOptionalExpr *expr) {
return simplifyExprType(expr);
}