Files
swift-mirror/test/Sema/availability_isolated_any.swift
John McCall 0f076c0702 Fix metadata availability testing for parameterized existentials
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.
2024-02-29 22:14:49 -05:00

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}}
}