Skip to content

Commit 96d58a4

Browse files
committed
Restore sema code that bans consuming from being applied to no escape functions.
(cherry picked from commit cbb9e15)
1 parent b1c6c63 commit 96d58a4

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

lib/Sema/TypeCheckType.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4287,7 +4287,31 @@ TypeResolver::resolveOwnershipTypeRepr(OwnershipTypeRepr *repr,
42874287
// Remember that we've seen an ownership specifier for this base type.
42884288
options |= TypeResolutionFlags::HasOwnership;
42894289

4290-
return resolveType(repr->getBase(), options);
4290+
auto result = resolveType(repr->getBase(), options);
4291+
if (result->hasError())
4292+
return result;
4293+
4294+
// Check for illegal combinations of ownership specifiers and types.
4295+
switch (ownershipRepr->getSpecifier()) {
4296+
case ParamSpecifier::Default:
4297+
case ParamSpecifier::InOut:
4298+
case ParamSpecifier::LegacyShared:
4299+
case ParamSpecifier::LegacyOwned:
4300+
case ParamSpecifier::Borrowing:
4301+
break;
4302+
case ParamSpecifier::Consuming:
4303+
if (auto *fnTy = result->getAs<FunctionType>()) {
4304+
if (fnTy->isNoEscape()) {
4305+
diagnoseInvalid(ownershipRepr, ownershipRepr->getLoc(),
4306+
diag::ownership_specifier_nonescaping_closure,
4307+
ownershipRepr->getSpecifierSpelling());
4308+
return ErrorType::get(getASTContext());
4309+
}
4310+
}
4311+
break;
4312+
}
4313+
4314+
return result;
42914315
}
42924316

42934317
NeverNullType

0 commit comments

Comments
 (0)