Skip to content

Commit d8c9ef8

Browse files
committed
[Type checker] Return folded expressions even on failure.
This is needed by code completion and the almost-removed CSDiag diagnostics generation.
1 parent 3b761dc commit d8c9ef8

File tree

3 files changed

+24
-8
lines changed

3 files changed

+24
-8
lines changed

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2068,22 +2068,34 @@ Type TypeChecker::typeCheckExpression(Expr *&expr, DeclContext *dc,
20682068
SolutionApplicationTarget target(
20692069
expr, convertTypePurpose, convertType,
20702070
options.contains(TypeCheckExprFlags::IsDiscarded));
2071-
auto resultType = typeCheckExpression(target, dc, options, listener, baseCS);
2072-
if (!resultType) {
2071+
bool unresolvedTypeExprs = false;
2072+
auto resultTarget = typeCheckExpression(
2073+
target, dc, unresolvedTypeExprs, options, listener, baseCS);
2074+
if (!resultTarget) {
2075+
expr = target.getAsExpr();
20732076
return Type();
20742077
}
20752078

2076-
expr = resultType->getAsExpr();
2079+
expr = resultTarget->getAsExpr();
2080+
2081+
// HACK for clients that want unresolved types.
2082+
if (unresolvedTypeExprs) {
2083+
return ErrorType::get(dc->getASTContext());
2084+
}
2085+
2086+
20772087
return expr->getType();
20782088
}
20792089

20802090
Optional<SolutionApplicationTarget>
20812091
TypeChecker::typeCheckExpression(
2082-
SolutionApplicationTarget target,
2092+
SolutionApplicationTarget &target,
20832093
DeclContext *dc,
2094+
bool &unresolvedTypeExprs,
20842095
TypeCheckExprOptions options,
20852096
ExprTypeCheckListener *listener,
20862097
ConstraintSystem *baseCS) {
2098+
unresolvedTypeExprs = false;
20872099
auto &Context = dc->getASTContext();
20882100
Expr *expr = target.getAsExpr();
20892101
FrontendStatsTracer StatsTracer(Context.Stats, "typecheck-expr", expr);
@@ -2092,6 +2104,7 @@ TypeChecker::typeCheckExpression(
20922104
// First, pre-check the expression, validating any types that occur in the
20932105
// expression and folding sequence expressions.
20942106
if (ConstraintSystem::preCheckExpression(expr, dc, baseCS)) {
2107+
target.setExpr(expr);
20952108
return None;
20962109
}
20972110

@@ -2155,8 +2168,10 @@ TypeChecker::typeCheckExpression(
21552168
expr, target.getExprContextualTypePurpose(), convertTo,
21562169
target.isDiscardedExpr());
21572170
auto viable = cs.solve(innerTarget, listener, allowFreeTypeVariables);
2158-
if (!viable)
2171+
if (!viable) {
2172+
target.setExpr(expr);
21592173
return None;
2174+
}
21602175

21612176
// If the client allows the solution to have unresolved type expressions,
21622177
// check for them now. We cannot apply the solution with unresolved TypeVars,
@@ -2165,7 +2180,7 @@ TypeChecker::typeCheckExpression(
21652180
(viable->size() != 1 ||
21662181
(convertType.getType() && convertType.getType()->hasUnresolvedType()))) {
21672182
// FIXME: This hack should only be needed for CSDiag.
2168-
target.getAsExpr()->setType(ErrorType::get(Context));
2183+
unresolvedTypeExprs = true;
21692184
return target;
21702185
}
21712186

lib/Sema/TypeChecker.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -834,8 +834,9 @@ class TypeChecker final {
834834
constraints::ConstraintSystem *baseCS = nullptr);
835835

836836
static Optional<constraints::SolutionApplicationTarget>
837-
typeCheckExpression(constraints::SolutionApplicationTarget target,
837+
typeCheckExpression(constraints::SolutionApplicationTarget &target,
838838
DeclContext *dc,
839+
bool &unresolvedTypeExprs,
839840
TypeCheckExprOptions options = TypeCheckExprOptions(),
840841
ExprTypeCheckListener *listener = nullptr,
841842
constraints::ConstraintSystem *baseCS = nullptr);

test/Constraints/closures.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ func testMap() {
186186
}
187187

188188
// <rdar://problem/22414757> "UnresolvedDot" "in wrong phase" assertion from verifier
189-
[].reduce { $0 + $1 } // expected-error {{cannot invoke 'reduce' with an argument list of type '(<<error type>>)'}}
189+
[].reduce { $0 + $1 } // expected-error {{cannot invoke 'reduce' with an argument list of type '(_)'}}
190190

191191

192192

0 commit comments

Comments
 (0)