mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
and implement it for @isolated(any) function types. The existing testing was pretty broken: we were diagnosing all sorts of things that don't require type metadata (like using a tuple with an extended existential in a value position in an API signature) and not diagnosing several things that do (like covariant function conversions that erase types). There's therefore some risk to this patch, but I'm not too worried because needing metadata like this is pretty uncommon, and it's likely that programs won't build correctly anyway --- it'll just get caught by the linker instead of the compiler.
44 lines
1.8 KiB
Swift
44 lines
1.8 KiB
Swift
// RUN: %target-typecheck-verify-swift -target %target-cpu-apple-macosx10.50 -enable-experimental-feature IsolatedAny
|
|
|
|
// REQUIRES: OS=macosx
|
|
|
|
// Concrete uses of @isolated(any) are fine.
|
|
func expectIsolatedAny(fn: @isolated(any) () -> ()) {}
|
|
|
|
func testConcrete1(fn: @isolated(any) () -> ()) {
|
|
expectIsolatedAny(fn: fn)
|
|
}
|
|
func testConcrete2(fn: @isolated(any) () -> ()) {
|
|
expectIsolatedAny {}
|
|
}
|
|
func testConcrete3(fn: @MainActor () -> ()) {
|
|
expectIsolatedAny {}
|
|
}
|
|
|
|
func testErasure(fn: @escaping @isolated(any) () -> ()) -> Any {
|
|
return fn // expected-error {{runtime support for @isolated(any) function types is only available in}}
|
|
// expected-note @-2 {{add @available attribute to enclosing global function}}
|
|
// expected-note @-2 {{add 'if #available' version check}}
|
|
}
|
|
|
|
func testCovariantErasure(fn: @escaping () -> @isolated(any) () -> Void) -> (() -> Any) {
|
|
return fn // expected-error {{runtime support for @isolated(any) function types is only available in}}
|
|
// expected-note @-2 {{add @available attribute to enclosing global function}}
|
|
// expected-note @-2 {{add 'if #available' version check}}
|
|
}
|
|
|
|
func testContravariantErasure(fn: @escaping (Any) -> Void) -> ((@escaping @isolated(any) () -> Void) -> Void) {
|
|
return fn // expected-error {{runtime support for @isolated(any) function types is only available in}}
|
|
// expected-note @-2 {{add @available attribute to enclosing global function}}
|
|
// expected-note @-2 {{add 'if #available' version check}}
|
|
}
|
|
|
|
protocol P {
|
|
associatedtype A
|
|
}
|
|
|
|
struct S: P { // expected-note {{add @available attribute to enclosing struct}}
|
|
typealias A = @isolated(any) () -> () // expected-error {{runtime support for @isolated(any) function types is only available in}}
|
|
// expected-note @-1 {{add @available attribute to enclosing type alias}}
|
|
}
|