Files
swift-mirror/test/Concurrency/sendable_without_preconcurrency.swift
Michael Gottesman 082b824a8e [rbi] Change Region Based Isolation for closures to not use the AST and instead just use SIL.
The reason why I am doing this is that in certain cases the AST captures indices
will never actually line up with partial apply capture indices since we seem to
"smush" together closures and locally defined functions.

NOTE: The reason for the really small amount of test changes is that this change
does not change the actual output by design. The only cases I had to change were
a case where we began to emit a better diagnostic and also where I added code
coverage around _ and let _ since those require ignored_use to be implemented so
that they would be diagnosed (previously we just did not emit anything so we
couldn't emit the diagnostic at the SIL level).

rdar://142661388
2025-01-22 21:12:36 -08:00

58 lines
2.2 KiB
Swift

// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -emit-module -emit-module-path %t/StrictModule.swiftmodule -module-name StrictModule -swift-version 6 %S/Inputs/StrictModule.swift
// RUN: %target-swift-frontend -emit-module -emit-module-path %t/NonStrictModule.swiftmodule -module-name NonStrictModule %S/Inputs/NonStrictModule.swift
// RUN: %target-swift-frontend -strict-concurrency=minimal -disable-availability-checking -I %t -verify %s -o /dev/null -emit-sil
// RUN: %target-swift-frontend -strict-concurrency=targeted -disable-availability-checking -I %t -verify %s -o /dev/null -emit-sil -verify-additional-prefix targeted-complete-
// RUN: %target-swift-frontend -strict-concurrency=complete -disable-availability-checking -I %t -verify %s -o /dev/null -emit-sil -verify-additional-prefix complete- -verify-additional-prefix targeted-complete- -verify-additional-prefix tns-
// REQUIRES: concurrency
import StrictModule // no remark: we never recommend @preconcurrency due to an explicitly non-Sendable (via -strict-concurrency=complete) type
import NonStrictModule
actor A {
func f() -> [StrictStruct: NonStrictClass] { [:] }
}
class NS { }
struct MyType {
var nsc: NonStrictClass
}
struct MyType2 {
var nsc: NonStrictClass
var ns: NS
}
func testA(ns: NS, mt: MyType, mt2: MyType2, sc: StrictClass, nsc: NonStrictClass) async {
Task { // expected-tns-warning {{passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure}}
print(ns) // expected-tns-note {{closure captures 'ns' which is accessible to code in the current task}}
print(mt)
print(mt2)
print(sc)
}
}
extension NonStrictStruct: @retroactive @unchecked Sendable { }
class StrictSubclass: StrictClass {
override func send(_ body: () -> ()) {}
override func dontSend(_ body: () -> ()) {}
}
struct StrictConformer: StrictProtocol {
func send(_ body: () -> Void) {}
func dontSend(_ body: () -> Void) {}
}
class NonStrictSubclass: NonStrictClass {
override func send(_ body: () -> ()) {}
override func dontSend(_ body: () -> ()) {}
}
struct NonStrictConformer: NonStrictProtocol {
func send(_ body: () -> Void) {}
func dontSend(_ body: () -> Void) {}
}