mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
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
65 lines
2.6 KiB
Swift
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
|
|
}
|