Files
swift-mirror/test/Concurrency/sendable_preconcurrency.swift
Michael Gottesman 3ed4059a60 [sema] Change non-sendable -> non-Sendable in diagnostics.
This matches send non sendable but importantly also makes it clear that we are
talking about something that doesn't conform to the Sendable protocol which is
capitalized.

rdar://151802975
2025-05-22 11:37:58 -07:00

65 lines
2.6 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=targeted -disable-availability-checking -I %t %s -o /dev/null -verify -emit-sil
// RUN: %target-swift-frontend -disable-availability-checking -I %t %s -o /dev/null -verify -emit-sil -strict-concurrency=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
@preconcurrency import NonStrictModule
actor A {
func f() -> [StrictStruct: NonStrictClass] { [:] }
}
class NS { } // expected-note {{class 'NS' does not conform to the 'Sendable' protocol}}
struct MyType {
var nsc: NonStrictClass
}
struct MyType2: Sendable {
var nsc: NonStrictClass // no warning; @preconcurrency suppressed it
var ns: NS // expected-warning{{stored property 'ns' of 'Sendable'-conforming struct 'MyType2' has non-Sendable type 'NS'}}
}
struct MyType3 {
var nsc: NonStrictClass
}
func testA(ns: NS, mt: MyType, mt2: MyType2, mt3: MyType3, 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(mt3)
print(sc)
print(nsc)
}
}
extension NonStrictStruct: @retroactive @unchecked Swift.Sendable { }
class StrictSubclass: StrictClass {
override func send(_ body: () -> ()) {}
override func dontSend(_ body: @Sendable () -> ()) {} // expected-warning {{declaration 'dontSend' has a type with different sendability from any potential overrides}}
}
struct StrictConformer: StrictProtocol {
func send(_ body: () -> Void) {}
func dontSend(_ body: @Sendable () -> Void) {} // expected-warning {{sendability of function types in instance method 'dontSend' does not match requirement in protocol 'StrictProtocol'}}
}
class NonStrictSubclass: NonStrictClass {
override func send(_ body: () -> ()) {}
override func dontSend(_ body: @Sendable () -> ()) {} // no-warning
}
struct NonStrictConformer: NonStrictProtocol {
func send(_ body: () -> Void) {}
func dontSend(_ body: @Sendable () -> Void) {} // no-warning
}