mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Find all the usages of `--enable-experimental-feature` or `--enable-upcoming-feature` in the tests and replace some of the `REQUIRES: asserts` to use `REQUIRES: swift-feature-Foo` instead, which should correctly apply to depending on the asserts/noasserts mode of the toolchain for each feature. Remove some comments that talked about enabling asserts since they don't apply anymore (but I might had miss some). All this was done with an automated script, so some formatting weirdness might happen, but I hope I fixed most of those. There might be some tests that were `REQUIRES: asserts` that might run in `noasserts` toolchains now. This will normally be because their feature went from experimental to upcoming/base and the tests were not updated.
138 lines
6.5 KiB
Swift
138 lines
6.5 KiB
Swift
// RUN: %target-typecheck-verify-swift -target %target-swift-5.1-abi-triple -enable-experimental-feature GroupActorErrors -strict-concurrency=complete
|
|
// REQUIRES: concurrency
|
|
// REQUIRES: swift_feature_GroupActorErrors
|
|
|
|
@MainActor
|
|
protocol P {
|
|
func f()
|
|
nonisolated func g()
|
|
}
|
|
|
|
@preconcurrency @MainActor
|
|
protocol Q {
|
|
func f()
|
|
nonisolated func g()
|
|
}
|
|
|
|
struct S: P {
|
|
func f() { }
|
|
func g() { }
|
|
}
|
|
|
|
@preconcurrency
|
|
struct NonConcurrentS: Q {
|
|
func f() { }
|
|
func g() { }
|
|
}
|
|
|
|
// expected-note@+1{{add '@MainActor' to make global function 'testP(s:p:)' part of global actor 'MainActor'}}
|
|
func testP(s: S, p: P) { // expected-error {{calls to '@MainActor'-isolated' code in global function 'testP(s:p:)'}}
|
|
p.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
p.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
p.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
p.g() // OKAY
|
|
s.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
s.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
s.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
s.g() // OKAY
|
|
}
|
|
// expected-note @+1{{add '@MainActor' to make global function 'testPreconcurrency(ncs:s:)' part of global actor 'MainActor'}}
|
|
func testPreconcurrency(ncs: NonConcurrentS, s:S ) { // expected-error {{calls to '@MainActor'-isolated' code in global function 'testPreconcurrency(ncs:s:)'}}
|
|
ncs.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
ncs.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
ncs.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
ncs.g() // OKAY
|
|
s.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
s.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
s.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
s.g() // OKAY
|
|
}
|
|
|
|
// expected-note @+1{{add '@MainActor' to make global function 'testOnlyPreconcurrency(ncs:)' part of global actor 'MainActor'}}
|
|
func testOnlyPreconcurrency(ncs: NonConcurrentS) { // expected-warning {{calls to '@MainActor'-isolated' code in global function 'testOnlyPreconcurrency(ncs:)'}}
|
|
ncs.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
ncs.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
ncs.f() // expected-note{{call to main actor-isolated instance method 'f()' in a synchronous nonisolated context}}
|
|
ncs.g() // OKAY
|
|
}
|
|
|
|
actor SomeActor { }
|
|
|
|
@globalActor
|
|
struct SomeGlobalActor {
|
|
static let shared = SomeActor()
|
|
}
|
|
|
|
@propertyWrapper
|
|
struct WrapperOnActor<Wrapped: Sendable> {
|
|
private var stored: Wrapped
|
|
|
|
nonisolated init(wrappedValue: Wrapped) {
|
|
stored = wrappedValue
|
|
}
|
|
|
|
@MainActor var wrappedValue: Wrapped {
|
|
get { }
|
|
set { }
|
|
}
|
|
|
|
@SomeGlobalActor var projectedValue: Wrapped {
|
|
get { }
|
|
set { }
|
|
}
|
|
}
|
|
|
|
struct HasWrapperOnActor {
|
|
@WrapperOnActor var x: Int = 0
|
|
@WrapperOnActor var y: String = ""
|
|
@WrapperOnActor var z: (Double, Double) = (1.0,2.0)
|
|
|
|
// expected-error@+2{{calls to '@MainActor'-isolated' code in instance method 'testWrapped()'}}
|
|
// expected-note@+1{{add '@MainActor' to make instance method 'testWrapped()' part of global actor 'MainActor'}}
|
|
func testWrapped() {
|
|
_ = x // expected-note{{main actor-isolated property 'x' can not be referenced from a nonisolated context}}
|
|
_ = y // expected-note{{main actor-isolated property 'y' can not be referenced from a nonisolated context}}
|
|
_ = z // expected-note{{main actor-isolated property 'z' can not be referenced from a nonisolated context}}
|
|
}
|
|
|
|
// expected-error@+2{{calls to '@SomeGlobalActor'-isolated' code in instance method 'testProjected()'}}
|
|
// expected-note@+1{{add '@SomeGlobalActor' to make instance method 'testProjected()' part of global actor 'SomeGlobalActor'}}
|
|
func testProjected(){
|
|
_ = $x // expected-note{{global actor 'SomeGlobalActor'-isolated property '$x' can not be referenced from a nonisolated context}}
|
|
_ = $y // expected-note{{global actor 'SomeGlobalActor'-isolated property '$y' can not be referenced from a nonisolated context}}
|
|
_ = $z // expected-note{{global actor 'SomeGlobalActor'-isolated property '$z' can not be referenced from a nonisolated context}}
|
|
}
|
|
|
|
@MainActor
|
|
func testMA(){ }
|
|
|
|
// expected-note@+1{{add '@MainActor' to make instance method 'testErrors()' part of global actor 'MainActor'}}
|
|
func testErrors() { // expected-error{{calls to '@MainActor'-isolated' code in instance method 'testErrors()'}}
|
|
testMA() // expected-error{{call to main actor-isolated instance method 'testMA()' in a synchronous nonisolated context}}
|
|
}
|
|
}
|
|
|
|
@preconcurrency @MainActor
|
|
class MainActorPreconcurrency {}
|
|
|
|
class InferMainActorPreconcurrency: MainActorPreconcurrency {
|
|
static func predatesConcurrency() {}
|
|
func predatesConcurrency (s: String) -> String { return s }
|
|
func predatesConcurrency (n: Int) -> Int { return n }
|
|
}
|
|
|
|
nonisolated func testPreconcurrency() {
|
|
InferMainActorPreconcurrency.predatesConcurrency()
|
|
// expected-warning@-1 {{call to main actor-isolated static method 'predatesConcurrency()' in a synchronous nonisolated context}}
|
|
}
|
|
|
|
func testPreconcurrencyGrouped() { // expected-warning {{calls to '@MainActor'-isolated' code in global function 'testPreconcurrencyGrouped()'}}
|
|
// expected-note@-1 {{add '@MainActor' to make global function 'testPreconcurrencyGrouped()' part of global actor 'MainActor'}}
|
|
InferMainActorPreconcurrency.predatesConcurrency()
|
|
// expected-note@-1 {{call to main actor-isolated static method 'predatesConcurrency()' in a synchronous nonisolated context}}
|
|
let _ = InferMainActorPreconcurrency().predatesConcurrency(s:"swift 6")
|
|
// expected-note@-1 {{call to main actor-isolated instance method 'predatesConcurrency(s:)' in a synchronous nonisolated context}}
|
|
let _ = InferMainActorPreconcurrency().predatesConcurrency(n:4)
|
|
// expected-note@-1 {{call to main actor-isolated instance method 'predatesConcurrency(n:)' in a synchronous nonisolated context}}
|
|
}
|