Merge pull request #71312 from xedin/promote-flag-for-infersendable-from-capture

[Frontend] NFC: Promote InferSendableFromCaptures to an upcoming feat…
This commit is contained in:
Pavel Yaskevich
2024-02-02 09:37:28 -08:00
committed by GitHub
4 changed files with 15 additions and 18 deletions

View File

@@ -126,8 +126,9 @@ UPCOMING_FEATURE(InternalImportsByDefault, 409, 6)
UPCOMING_FEATURE(IsolatedDefaultValues, 411, 6) UPCOMING_FEATURE(IsolatedDefaultValues, 411, 6)
UPCOMING_FEATURE(GlobalConcurrency, 412, 6) UPCOMING_FEATURE(GlobalConcurrency, 412, 6)
UPCOMING_FEATURE(FullTypedThrows, 413, 6) UPCOMING_FEATURE(FullTypedThrows, 413, 6)
UPCOMING_FEATURE(ExistentialAny, 335, 7) UPCOMING_FEATURE(ExistentialAny, 335, 7)
UPCOMING_FEATURE(InferSendableFromCaptures, 418, 6)
EXPERIMENTAL_FEATURE(StaticAssert, false) EXPERIMENTAL_FEATURE(StaticAssert, false)
EXPERIMENTAL_FEATURE(NamedOpaqueTypes, false) EXPERIMENTAL_FEATURE(NamedOpaqueTypes, false)
@@ -246,10 +247,6 @@ EXPERIMENTAL_FEATURE(StructLetDestructuring, true)
/// lifetime-dependent results. /// lifetime-dependent results.
EXPERIMENTAL_FEATURE(NonescapableTypes, true) EXPERIMENTAL_FEATURE(NonescapableTypes, true)
// Infer Sendability of unapplied and partial applied methods,
// global functions and key paths.
EXPERIMENTAL_FEATURE(InferSendableFromCaptures, false)
// Allow optional isolated parameters. // Allow optional isolated parameters.
EXPERIMENTAL_FEATURE(OptionalIsolatedParameters, true) EXPERIMENTAL_FEATURE(OptionalIsolatedParameters, true)

View File

@@ -26,11 +26,11 @@ struct X {
@MainActor func onMainActor() { } @MainActor func onMainActor() { }
func testInAsync(x: X) async { func testInAsync(x: X) async {
let _: Int = unsafelySendableClosure // expected-error{{type '(@Sendable () -> Void) -> ()'}} let _: Int = unsafelySendableClosure // expected-error{{type '@Sendable (@Sendable () -> Void) -> ()'}}
let _: Int = unsafelyMainActorClosure // expected-error{{type '(@MainActor () -> Void) -> ()'}} let _: Int = unsafelyMainActorClosure // expected-error{{type '@Sendable (@MainActor () -> Void) -> ()'}}
let _: Int = unsafelyDoEverythingClosure // expected-error{{type '(@MainActor @Sendable () -> Void) -> ()'}} let _: Int = unsafelyDoEverythingClosure // expected-error{{type '@Sendable (@MainActor @Sendable () -> Void) -> ()'}}
let _: Int = x.unsafelyDoEverythingClosure // expected-error{{type '(@MainActor @Sendable () -> Void) -> ()'}} let _: Int = x.unsafelyDoEverythingClosure // expected-error{{type '(@MainActor @Sendable () -> Void) -> ()'}}
let _: Int = X.unsafelyDoEverythingClosure // expected-error{{type '(X) -> (@MainActor @Sendable () -> Void) -> ()'}} let _: Int = X.unsafelyDoEverythingClosure // expected-error{{type '@Sendable (X) -> (@MainActor @Sendable () -> Void) -> ()'}}
let _: Int = (X.unsafelyDoEverythingClosure)(x) // expected-error{{type '(@MainActor @Sendable () -> Void) -> ()'}} let _: Int = (X.unsafelyDoEverythingClosure)(x) // expected-error{{type '(@MainActor @Sendable () -> Void) -> ()'}}
let _: Int = x.sendableVar // expected-error{{type '@Sendable () -> Void'}} let _: Int = x.sendableVar // expected-error{{type '@Sendable () -> Void'}}
@@ -41,11 +41,11 @@ func testInAsync(x: X) async {
} }
func testElsewhere(x: X) { func testElsewhere(x: X) {
let _: Int = unsafelySendableClosure // expected-error{{type '(@Sendable () -> Void) -> ()'}} let _: Int = unsafelySendableClosure // expected-error{{type '@Sendable (@Sendable () -> Void) -> ()'}}
let _: Int = unsafelyMainActorClosure // expected-error{{type '(@MainActor () -> Void) -> ()'}} let _: Int = unsafelyMainActorClosure // expected-error{{type '@Sendable (@MainActor () -> Void) -> ()'}}
let _: Int = unsafelyDoEverythingClosure // expected-error{{type '(@MainActor @Sendable () -> Void) -> ()'}} let _: Int = unsafelyDoEverythingClosure // expected-error{{type '@Sendable (@MainActor @Sendable () -> Void) -> ()'}}
let _: Int = x.unsafelyDoEverythingClosure // expected-error{{type '(@MainActor @Sendable () -> Void) -> ()'}} let _: Int = x.unsafelyDoEverythingClosure // expected-error{{type '(@MainActor @Sendable () -> Void) -> ()'}}
let _: Int = X.unsafelyDoEverythingClosure // expected-error{{type '(X) -> (@MainActor @Sendable () -> Void) -> ()'}} let _: Int = X.unsafelyDoEverythingClosure // expected-error{{type '@Sendable (X) -> (@MainActor @Sendable () -> Void) -> ()'}}
let _: Int = (X.unsafelyDoEverythingClosure)(x) // expected-error{{type '(@MainActor @Sendable () -> Void) -> ()'}} let _: Int = (X.unsafelyDoEverythingClosure)(x) // expected-error{{type '(@MainActor @Sendable () -> Void) -> ()'}}
let _: Int = x.sendableVar // expected-error{{type '@Sendable () -> Void'}} let _: Int = x.sendableVar // expected-error{{type '@Sendable () -> Void'}}
@@ -67,7 +67,7 @@ func testCalls(x: X) {
// expected-note@-1 2{{add '@MainActor' to make global function 'testCalls(x:)' part of global actor 'MainActor'}} // expected-note@-1 2{{add '@MainActor' to make global function 'testCalls(x:)' part of global actor 'MainActor'}}
onMainActorAlways() // expected-error{{call to main actor-isolated global function 'onMainActorAlways()' in a synchronous nonisolated context}} onMainActorAlways() // expected-error{{call to main actor-isolated global function 'onMainActorAlways()' in a synchronous nonisolated context}}
let _: () -> Void = onMainActorAlways // expected-error{{converting function value of type '@MainActor () -> ()' to '() -> Void' loses global actor 'MainActor'}} let _: () -> Void = onMainActorAlways // expected-error{{converting function value of type '@MainActor @Sendable () -> ()' to '() -> Void' loses global actor 'MainActor'}}
let c = MyModelClass() // okay, synthesized init() is 'nonisolated' let c = MyModelClass() // okay, synthesized init() is 'nonisolated'
@@ -78,7 +78,7 @@ func testCallsWithAsync() async {
onMainActorAlways() // expected-error{{expression is 'async' but is not marked with 'await'}} onMainActorAlways() // expected-error{{expression is 'async' but is not marked with 'await'}}
// expected-note@-1{{calls to global function 'onMainActorAlways()' from outside of its actor context are implicitly asynchronous}} // expected-note@-1{{calls to global function 'onMainActorAlways()' from outside of its actor context are implicitly asynchronous}}
let _: () -> Void = onMainActorAlways // expected-error{{converting function value of type '@MainActor () -> ()' to '() -> Void' loses global actor 'MainActor'}} let _: () -> Void = onMainActorAlways // expected-error{{converting function value of type '@MainActor @Sendable () -> ()' to '() -> Void' loses global actor 'MainActor'}}
let c = MyModelClass() // okay, synthesized init() is 'nonisolated' let c = MyModelClass() // okay, synthesized init() is 'nonisolated'

View File

@@ -1,4 +1,4 @@
// RUN: %target-typecheck-verify-swift -enable-experimental-feature InferSendableFromCaptures -strict-concurrency=complete // RUN: %target-typecheck-verify-swift -enable-upcoming-feature InferSendableFromCaptures -strict-concurrency=complete
// REQUIRES: concurrency // REQUIRES: concurrency
// REQUIRES: asserts // REQUIRES: asserts

View File

@@ -1,5 +1,5 @@
// RUN: %target-typecheck-verify-swift -enable-experimental-feature InferSendableFromCaptures -disable-availability-checking // RUN: %target-typecheck-verify-swift -enable-upcoming-feature InferSendableFromCaptures -disable-availability-checking
// RUN: %target-swift-emit-silgen %s -verify -enable-experimental-feature InferSendableFromCaptures -disable-availability-checking -module-name sendable_methods | %FileCheck %s // RUN: %target-swift-emit-silgen %s -verify -enable-upcoming-feature InferSendableFromCaptures -disable-availability-checking -module-name sendable_methods | %FileCheck %s
// REQUIRES: concurrency // REQUIRES: concurrency
// REQUIRES: asserts // REQUIRES: asserts