Skip to content

Commit 85a66d7

Browse files
committed
[sending] Fix parsing of sending results in closures.
The specific problem is that in the type checker where we validate that it is legal to apply sending to a result, we attempt to use the TypeResolutionFlags... but only given the previous implementation would get access to TypeResolutionFlags::InContext. To fix this I renamed the current TypeResolutionFlags::ClosureExpr -> ClosureExprParameters and added a new flag TypeResolutionFlags::ClosureExprResult. By not reusing ClosureExprParameters, I am being more conservative to ensure my work here does not break parameters as well.
1 parent 2ac874e commit 85a66d7

File tree

5 files changed

+24
-10
lines changed

5 files changed

+24
-10
lines changed

lib/Sema/CSGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2543,7 +2543,7 @@ namespace {
25432543

25442544
const auto resolvedTy = resolveTypeReferenceInExpression(
25452545
closure->getExplicitResultTypeRepr(),
2546-
TypeResolverContext::InExpression, resultLocator);
2546+
TypeResolverContext::ClosureExprResult, resultLocator);
25472547
if (resolvedTy)
25482548
return resolvedTy;
25492549
}

lib/Sema/TypeCheckDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2297,7 +2297,7 @@ static Type validateParameterType(ParamDecl *decl) {
22972297
TypeResolutionOptions options(std::nullopt);
22982298
OpenUnboundGenericTypeFn unboundTyOpener = nullptr;
22992299
if (isa<AbstractClosureExpr>(dc)) {
2300-
options = TypeResolutionOptions(TypeResolverContext::ClosureExpr);
2300+
options = TypeResolutionOptions(TypeResolverContext::ClosureExprParameters);
23012301
options |= TypeResolutionFlags::AllowUnspecifiedTypes;
23022302
unboundTyOpener = [](auto unboundTy) {
23032303
// FIXME: Don't let unbound generic types escape type resolution.

lib/Sema/TypeCheckType.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ static unsigned getGenericRequirementKind(TypeResolutionOptions options) {
159159
case TypeResolverContext::ForEachStmt:
160160
case TypeResolverContext::PatternBindingDecl:
161161
case TypeResolverContext::EditorPlaceholderExpr:
162-
case TypeResolverContext::ClosureExpr:
162+
case TypeResolverContext::ClosureExprParameters:
163+
case TypeResolverContext::ClosureExprResult:
163164
case TypeResolverContext::VariadicFunctionInput:
164165
case TypeResolverContext::InoutFunctionInput:
165166
case TypeResolverContext::FunctionResult:
@@ -4971,7 +4972,8 @@ TypeResolver::resolveSendingTypeRepr(SendingTypeRepr *repr,
49714972
return ErrorType::get(getASTContext());
49724973
}
49734974

4974-
if (!options.is(TypeResolverContext::FunctionResult) &&
4975+
if (!options.is(TypeResolverContext::ClosureExprResult) &&
4976+
!options.is(TypeResolverContext::FunctionResult) &&
49754977
(!options.is(TypeResolverContext::FunctionInput) ||
49764978
options.hasBase(TypeResolverContext::EnumElementDecl))) {
49774979
diagnoseInvalid(repr, repr->getSpecifierLoc(),
@@ -5193,7 +5195,8 @@ NeverNullType TypeResolver::resolveImplicitlyUnwrappedOptionalType(
51935195
case TypeResolverContext::InExpression:
51945196
case TypeResolverContext::EditorPlaceholderExpr:
51955197
case TypeResolverContext::AbstractFunctionDecl:
5196-
case TypeResolverContext::ClosureExpr:
5198+
case TypeResolverContext::ClosureExprParameters:
5199+
case TypeResolverContext::ClosureExprResult:
51975200
case TypeResolverContext::Inherited:
51985201
case TypeResolverContext::GenericParameterInherited:
51995202
case TypeResolverContext::AssociatedTypeInherited:

lib/Sema/TypeCheckType.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,10 @@ enum class TypeResolverContext : uint8_t {
119119
SubscriptDecl,
120120

121121
/// Whether we are checking the parameter list of a closure.
122-
ClosureExpr,
122+
ClosureExprParameters,
123+
124+
/// Whether we are checking the result of a closure.
125+
ClosureExprResult,
123126

124127
/// Whether we are in the input type of a function, or under one level of
125128
/// tuple type. This is not set for multi-level tuple arguments.
@@ -272,7 +275,8 @@ class TypeResolutionOptions {
272275
case Context::ForEachStmt:
273276
case Context::PatternBindingDecl:
274277
case Context::EditorPlaceholderExpr:
275-
case Context::ClosureExpr:
278+
case Context::ClosureExprParameters:
279+
case Context::ClosureExprResult:
276280
return true;
277281
case Context::None:
278282
case Context::ScalarGenericArgument:
@@ -332,7 +336,8 @@ class TypeResolutionOptions {
332336
case Context::ForEachStmt:
333337
case Context::PatternBindingDecl:
334338
case Context::EditorPlaceholderExpr:
335-
case Context::ClosureExpr:
339+
case Context::ClosureExprParameters:
340+
case Context::ClosureExprResult:
336341
case Context::FunctionInput:
337342
case Context::VariadicFunctionInput:
338343
case Context::InoutFunctionInput:
@@ -376,7 +381,8 @@ class TypeResolutionOptions {
376381
case Context::ExplicitCastExpr:
377382
case Context::ForEachStmt:
378383
case Context::EditorPlaceholderExpr:
379-
case Context::ClosureExpr:
384+
case Context::ClosureExprParameters:
385+
case Context::ClosureExprResult:
380386
case Context::InoutFunctionInput:
381387
case Context::FunctionResult:
382388
case Context::SubscriptDecl:
@@ -419,7 +425,8 @@ class TypeResolutionOptions {
419425
case Context::ForEachStmt:
420426
case Context::PatternBindingDecl:
421427
case Context::EditorPlaceholderExpr:
422-
case Context::ClosureExpr:
428+
case Context::ClosureExprParameters:
429+
case Context::ClosureExprResult:
423430
case Context::VariadicFunctionInput:
424431
case Context::InoutFunctionInput:
425432
case Context::FunctionResult:

test/Concurrency/sending_closure_inference.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,7 @@ func testNamedTypeParameterSendingInference() {
4242
func testSendingResultInference() {
4343
let _: () -> sending String = { "" }
4444
}
45+
46+
func testSendingResultOnClosure() {
47+
let _ = { (x: String) -> sending String in x }
48+
}

0 commit comments

Comments
 (0)