|
| 1 | +// RUN: %target-swift-frontend -swift-version 6 -disable-availability-checking -emit-sil -o /dev/null %s -parse-as-library -enable-experimental-feature TransferringArgsAndResults -verify -import-objc-header %S/Inputs/transferring.h |
| 2 | + |
| 3 | +// REQUIRES: concurrency |
| 4 | +// REQUIRES: asserts |
| 5 | +// REQUIRES: objc_interop |
| 6 | + |
| 7 | +//////////////////////// |
| 8 | +// MARK: Declarations // |
| 9 | +//////////////////////// |
| 10 | + |
| 11 | +@MainActor func transferToMain<T>(_ t: T) async {} |
| 12 | +func useValue<T>(_ t: T) {} |
| 13 | + |
| 14 | +///////////////// |
| 15 | +// MARK: Tests // |
| 16 | +///////////////// |
| 17 | + |
| 18 | +func methodTestTransferringResult() async { |
| 19 | + let x = MyType() |
| 20 | + let y = x.getTransferringResult() |
| 21 | + await transferToMain(x) |
| 22 | + useValue(y) |
| 23 | +} |
| 24 | + |
| 25 | +func methodTestTransferringArg() async { |
| 26 | + let x = MyType() |
| 27 | + let s = NSObject() |
| 28 | + let _ = x.getResultWithTransferringArgument(s) // expected-error {{binding of non-Sendable type 'NSObject' accessed after being transferred}} |
| 29 | + useValue(s) // expected-note {{access here could race}} |
| 30 | +} |
| 31 | + |
| 32 | +// Make sure we just ignore the swift_attr if it is applied to something like a |
| 33 | +// class. |
| 34 | +func testDoesntMakeSense() { |
| 35 | + let _ = DoesntMakeSense() |
| 36 | +} |
| 37 | + |
| 38 | +func funcTestTransferringResult() async { |
| 39 | + let x = NSObject() |
| 40 | + let y = transferNSObjectFromGlobalFunction(x) |
| 41 | + await transferToMain(x) |
| 42 | + useValue(y) |
| 43 | + |
| 44 | + // Just to show that without the transferring param, we generate diagnostics. |
| 45 | + let x2 = NSObject() |
| 46 | + let y2 = returnNSObjectFromGlobalFunction(x2) |
| 47 | + await transferToMain(x2) // expected-error {{transferring 'x2' may cause a race}} |
| 48 | + // expected-note @-1 {{transferring disconnected 'x2' to main actor-isolated callee could cause races in between callee main actor-isolated and local nonisolated uses}} |
| 49 | + useValue(y2) // expected-note {{access here could race}} |
| 50 | +} |
| 51 | + |
| 52 | +func funcTestTransferringArg() async { |
| 53 | + let x = NSObject() |
| 54 | + transferNSObjectToGlobalFunction(x) // expected-error {{binding of non-Sendable type 'NSObject' accessed after being transferred}} |
| 55 | + useValue(x) // expected-note {{access here could race}} |
| 56 | +} |
0 commit comments