Skip to content

Commit 4b0e7b2

Browse files
committed
[Type checker] Sink logic for @autoclosure default parameters into the solver
Rather than use an ExprTypeCheckListener subclass to introduce the autoclosure expression, do it at the end of solving.
1 parent bf124b8 commit 4b0e7b2

File tree

4 files changed

+26
-26
lines changed

4 files changed

+26
-26
lines changed

lib/Sema/CSDiagnostics.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,7 @@ Optional<Diag<Type, Type>> GenericArgumentsMismatchFailure::getDiagnosticFor(
560560
case CTP_ReturnSingleExpr:
561561
return diag::cannot_convert_to_return_type;
562562
case CTP_DefaultParameter:
563+
case CTP_AutoclosureDefaultParameter:
563564
return diag::cannot_convert_default_arg_value;
564565
case CTP_YieldByValue:
565566
return diag::cannot_convert_yield_value;
@@ -2085,6 +2086,7 @@ getContextualNilDiagnostic(ContextualTypePurpose CTP) {
20852086
case CTP_EnumCaseRawValue:
20862087
return diag::cannot_convert_raw_initializer_value_nil;
20872088
case CTP_DefaultParameter:
2089+
case CTP_AutoclosureDefaultParameter:
20882090
return diag::cannot_convert_default_arg_value_nil;
20892091
case CTP_YieldByValue:
20902092
return diag::cannot_convert_yield_value_nil;
@@ -2863,6 +2865,7 @@ ContextualFailure::getDiagnosticFor(ContextualTypePurpose context,
28632865
case CTP_EnumCaseRawValue:
28642866
return diag::cannot_convert_raw_initializer_value;
28652867
case CTP_DefaultParameter:
2868+
case CTP_AutoclosureDefaultParameter:
28662869
return forProtocol ? diag::cannot_convert_default_arg_value_protocol
28672870
: diag::cannot_convert_default_arg_value;
28682871
case CTP_YieldByValue:

lib/Sema/CSSimplify.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9130,6 +9130,7 @@ void ConstraintSystem::addContextualConversionConstraint(
91309130
case CTP_ThrowStmt:
91319131
case CTP_EnumCaseRawValue:
91329132
case CTP_DefaultParameter:
9133+
case CTP_AutoclosureDefaultParameter:
91339134
case CTP_ClosureResult:
91349135
case CTP_DictionaryKey:
91359136
case CTP_DictionaryValue:

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2107,6 +2107,14 @@ Type TypeChecker::typeCheckExpression(Expr *&expr, DeclContext *dc,
21072107
}
21082108
}
21092109

2110+
// For an @autoclosure default parameter, we want to convert to the result
2111+
// type. Stash the autoclosure default parameter type.
2112+
FunctionType *autoclosureDefaultParamType = nullptr;
2113+
if (convertTypePurpose == CTP_AutoclosureDefaultParameter) {
2114+
autoclosureDefaultParamType = convertType.getType()->castTo<FunctionType>();
2115+
convertType.setType(autoclosureDefaultParamType->getResult());
2116+
}
2117+
21102118
// Tell the constraint system what the contextual type is. This informs
21112119
// diagnostics and is a hint for various performance optimizations.
21122120
// FIXME: Look through LoadExpr. This is an egregious hack due to the
@@ -2130,6 +2138,7 @@ Type TypeChecker::typeCheckExpression(Expr *&expr, DeclContext *dc,
21302138
allowFreeTypeVariables = FreeTypeVariableBinding::UnresolvedType;
21312139

21322140
Type convertTo = convertType.getType();
2141+
21332142
if (options.contains(TypeCheckExprFlags::ExpressionTypeMustBeOptional)) {
21342143
assert(!convertTo && "convertType and type check options conflict");
21352144
auto *convertTypeLocator =
@@ -2175,6 +2184,12 @@ Type TypeChecker::typeCheckExpression(Expr *&expr, DeclContext *dc,
21752184
}
21762185
result = resultTarget->getAsExpr();
21772186

2187+
// For an @autoclosure default parameter type, add the autoclosure
2188+
// conversion.
2189+
if (convertTypePurpose == CTP_AutoclosureDefaultParameter) {
2190+
result = cs.buildAutoClosureExpr(result, autoclosureDefaultParamType);
2191+
}
2192+
21782193
// Notify listener that we've applied the solution.
21792194
if (listener)
21802195
result = listener->appliedSolution(solution, result);
@@ -2204,32 +2219,9 @@ Type TypeChecker::typeCheckParameterDefault(Expr *&defaultValue,
22042219
DeclContext *DC, Type paramType,
22052220
bool isAutoClosure) {
22062221
assert(paramType && !paramType->hasError());
2207-
2208-
if (isAutoClosure) {
2209-
class AutoClosureListener : public ExprTypeCheckListener {
2210-
FunctionType *ParamType;
2211-
2212-
public:
2213-
AutoClosureListener(FunctionType *paramType)
2214-
: ParamType(paramType) {}
2215-
2216-
Expr *appliedSolution(constraints::Solution &solution,
2217-
Expr *expr) override {
2218-
auto &cs = solution.getConstraintSystem();
2219-
return cs.buildAutoClosureExpr(expr, ParamType);
2220-
}
2221-
};
2222-
2223-
auto *fnType = paramType->castTo<FunctionType>();
2224-
AutoClosureListener listener(fnType);
2225-
return typeCheckExpression(defaultValue, DC,
2226-
TypeLoc::withoutLoc(fnType->getResult()),
2227-
CTP_DefaultParameter, TypeCheckExprOptions(),
2228-
&listener);
2229-
}
2230-
2231-
return typeCheckExpression(defaultValue, DC, TypeLoc::withoutLoc(paramType),
2232-
CTP_DefaultParameter);
2222+
return typeCheckExpression(
2223+
defaultValue, DC, TypeLoc::withoutLoc(paramType),
2224+
isAutoClosure ? CTP_AutoclosureDefaultParameter : CTP_DefaultParameter);
22332225
}
22342226

22352227
Type TypeChecker::

lib/Sema/TypeChecker.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,10 @@ enum ContextualTypePurpose {
133133
CTP_EnumCaseRawValue, ///< Raw value specified for "case X = 42" in enum.
134134
CTP_DefaultParameter, ///< Default value in parameter 'foo(a : Int = 42)'.
135135

136+
/// Default value in @autoclosure parameter
137+
/// 'foo(a : @autoclosure () -> Int = 42)'.
138+
CTP_AutoclosureDefaultParameter,
139+
136140
CTP_CalleeResult, ///< Constraint is placed on the result of a callee.
137141
CTP_CallArgument, ///< Call to function or operator requires type.
138142
CTP_ClosureResult, ///< Closure result expects a specific type.

0 commit comments

Comments
 (0)