@@ -2068,22 +2068,34 @@ Type TypeChecker::typeCheckExpression(Expr *&expr, DeclContext *dc,
2068
2068
SolutionApplicationTarget target (
2069
2069
expr, convertTypePurpose, convertType,
2070
2070
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 ();
2073
2076
return Type ();
2074
2077
}
2075
2078
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
+
2077
2087
return expr->getType ();
2078
2088
}
2079
2089
2080
2090
Optional<SolutionApplicationTarget>
2081
2091
TypeChecker::typeCheckExpression (
2082
- SolutionApplicationTarget target,
2092
+ SolutionApplicationTarget & target,
2083
2093
DeclContext *dc,
2094
+ bool &unresolvedTypeExprs,
2084
2095
TypeCheckExprOptions options,
2085
2096
ExprTypeCheckListener *listener,
2086
2097
ConstraintSystem *baseCS) {
2098
+ unresolvedTypeExprs = false ;
2087
2099
auto &Context = dc->getASTContext ();
2088
2100
Expr *expr = target.getAsExpr ();
2089
2101
FrontendStatsTracer StatsTracer (Context.Stats , " typecheck-expr" , expr);
@@ -2092,6 +2104,7 @@ TypeChecker::typeCheckExpression(
2092
2104
// First, pre-check the expression, validating any types that occur in the
2093
2105
// expression and folding sequence expressions.
2094
2106
if (ConstraintSystem::preCheckExpression (expr, dc, baseCS)) {
2107
+ target.setExpr (expr);
2095
2108
return None;
2096
2109
}
2097
2110
@@ -2155,8 +2168,10 @@ TypeChecker::typeCheckExpression(
2155
2168
expr, target.getExprContextualTypePurpose (), convertTo,
2156
2169
target.isDiscardedExpr ());
2157
2170
auto viable = cs.solve (innerTarget, listener, allowFreeTypeVariables);
2158
- if (!viable)
2171
+ if (!viable) {
2172
+ target.setExpr (expr);
2159
2173
return None;
2174
+ }
2160
2175
2161
2176
// If the client allows the solution to have unresolved type expressions,
2162
2177
// check for them now. We cannot apply the solution with unresolved TypeVars,
@@ -2165,7 +2180,7 @@ TypeChecker::typeCheckExpression(
2165
2180
(viable->size () != 1 ||
2166
2181
(convertType.getType () && convertType.getType ()->hasUnresolvedType ()))) {
2167
2182
// FIXME: This hack should only be needed for CSDiag.
2168
- target. getAsExpr ()-> setType ( ErrorType::get (Context)) ;
2183
+ unresolvedTypeExprs = true ;
2169
2184
return target;
2170
2185
}
2171
2186
0 commit comments