diff --git a/lib/Sema/TypeCheckExpr.cpp b/lib/Sema/TypeCheckExpr.cpp index 9a5bb2e0fbbd4..8de6d67f708ff 100644 --- a/lib/Sema/TypeCheckExpr.cpp +++ b/lib/Sema/TypeCheckExpr.cpp @@ -633,6 +633,14 @@ swift::DefaultTypeRequest::evaluate(Evaluator &evaluator, } Expr *TypeChecker::foldSequence(SequenceExpr *expr, DeclContext *dc) { + // We may end up running pre-checking multiple times for completion, just use + // the folded expression if we've already folded the sequence. + // FIXME: We ought to fix completion to not pre-check multiple times, strictly + // speaking it isn't idempotent (e.g for things like `markDirectCallee`). + if (dc->getASTContext().CompletionCallback) { + if (auto *folded = expr->getFoldedExpr()) + return folded; + } // First resolve any unresolved decl references in operator positions. for (auto i : indices(expr->getElements())) { if (i % 2 == 0) diff --git a/validation-test/IDE/issues_fixed/issue-75845.swift b/validation-test/IDE/issues_fixed/issue-75845.swift new file mode 100644 index 0000000000000..41b0c529b0660 --- /dev/null +++ b/validation-test/IDE/issues_fixed/issue-75845.swift @@ -0,0 +1,17 @@ +// RUN: %batch-code-completion + +// https://github.com/apple/swift/issues/75845 +// Make sure we don't crash. + +struct Foo { + init() { + do { + } catch { + #^A^#self#^B^# = #^C^#error#^D^# + } + } +} +// A: Decl[LocalVar]/Local: error[#any Error#]; name=error +// B: Begin completions +// C: Decl[LocalVar]/Local: error[#any Error#]; name=error +// D: Begin completions