mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The specific issue was when we were walking instructions looking to see if there was a partial apply escaping instruction, we were not including the user itself. That means that if the user was the partial apply escaping instruction, we would return that no escape occured. rdar://149414471
45 lines
1.5 KiB
Swift
45 lines
1.5 KiB
Swift
// RUN: %target-swift-frontend -target %target-swift-5.1-abi-triple %import-libdispatch -strict-concurrency=complete %s -emit-sil -o /dev/null -verify -strict-concurrency=targeted
|
|
// RUN: %target-swift-frontend -target %target-swift-5.1-abi-triple %import-libdispatch -strict-concurrency=complete %s -emit-sil -o /dev/null -verify -verify-additional-prefix tns-
|
|
|
|
// REQUIRES: concurrency
|
|
// REQUIRES: libdispatch
|
|
|
|
import Dispatch
|
|
|
|
// Tests the inference of @_unsafeSendable and @MainActor when working with
|
|
// the Dispatch library, and specifically, DispatchQueue.
|
|
@MainActor func onlyOnMainActor() { }
|
|
|
|
func testMe() {
|
|
DispatchQueue.main.async {
|
|
onlyOnMainActor() // okay, due to inference of @MainActor-ness
|
|
}
|
|
|
|
DispatchQueue.main.sync {
|
|
onlyOnMainActor()
|
|
}
|
|
}
|
|
|
|
func testUnsafeSendableInMainAsync() async {
|
|
var x = 5
|
|
DispatchQueue.main.async {
|
|
x = 17 // expected-warning{{mutation of captured var 'x' in concurrently-executing code}}
|
|
// expected-tns-warning @-1 {{sending 'x' risks causing data races}}
|
|
// expected-tns-note @-2 {{'x' is captured by a main actor-isolated closure. main actor-isolated uses in closure may race against later nonisolated uses}}
|
|
}
|
|
print(x) // expected-tns-note {{access can happen concurrently}}
|
|
}
|
|
|
|
func testUnsafeSendableInAsync(queue: DispatchQueue) async {
|
|
var x = 5
|
|
queue.async {
|
|
x = 17 // expected-warning{{mutation of captured var 'x' in concurrently-executing code}}
|
|
}
|
|
|
|
queue.sync {
|
|
x = 17 // okay
|
|
}
|
|
|
|
print(x)
|
|
}
|