Files
swift-mirror/test/Concurrency/dispatch_inference.swift
Michael Gottesman 6eee52fb01 [rbi] When checking for partial apply reachability of a value at a user, include the user itself in case the user is the actual partial apply
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
2025-04-17 12:26:34 -07:00

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)
}