mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
expr for global actors. This eliminates a crash when type checking `#isolation` expansions for global actors nested in other types, because the `TypeExpr` does not properly represent the type repr for nested types. It's simpler to provide the type directly instead of going through type resolution.
145 lines
3.8 KiB
Swift
145 lines
3.8 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-swift-frontend -dump-ast %s | %FileCheck %s
|
|
|
|
// Diagnostics testing
|
|
// RUN: not %target-swift-frontend -swift-version 5 -typecheck -DTEST_DIAGNOSTICS %s > %t/diagnostics.txt 2>&1
|
|
// RUN: %FileCheck %s --check-prefix CHECK-DIAGS < %t/diagnostics.txt
|
|
|
|
// REQUIRES: concurrency
|
|
// REQUIRES: swift_swift_parser
|
|
|
|
// CHECK-LABEL: nonisolatedFunc()
|
|
@available(SwiftStdlib 5.1, *)
|
|
func nonisolatedFunc() {
|
|
// CHECK: macro_expansion_expr
|
|
// CHECK: rewritten=current_context_isolation_expr
|
|
// CHECK-NEXT: nil_literal_expr
|
|
_ = #isolation
|
|
}
|
|
|
|
// CHECK-LABEL: nonisolatedAsyncFunc()
|
|
@available(SwiftStdlib 5.1, *)
|
|
func nonisolatedAsyncFunc() async {
|
|
// CHECK: macro_expansion_expr
|
|
// CHECK: rewritten=current_context_isolation_expr
|
|
// CHECK-NEXT: nil_literal_expr
|
|
_ = #isolation
|
|
}
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
actor A {
|
|
}
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
extension A {
|
|
// CHECK-LABEL: actorIsolationToSelf()
|
|
func actorIsolationToSelf() {
|
|
// CHECK: macro_expansion_expr
|
|
// CHECK: rewritten=current_context_isolation_expr
|
|
// CHECK-NEXT: inject_into_optional
|
|
// CHECK-NEXT: erasure_expr
|
|
// CHECK: declref_expr type="A"{{.*}}self@
|
|
_ = #isolation
|
|
}
|
|
}
|
|
|
|
// CHECK-LABEL: actorIsolationToParam(_:)
|
|
@available(SwiftStdlib 5.1, *)
|
|
func actorIsolationToParam(_ isolatedParam: isolated A) {
|
|
// CHECK: macro_expansion_expr
|
|
// CHECK: rewritten=current_context_isolation_expr
|
|
// CHECK-NEXT: inject_into_optional
|
|
// CHECK-NEXT: erasure_expr
|
|
// CHECK: declref_expr type="A"{{.*}}isolatedParam@
|
|
_ = #isolation
|
|
}
|
|
|
|
// CHECK-LABEL: mainActorIsolated()
|
|
@available(SwiftStdlib 5.1, *)
|
|
@MainActor
|
|
func mainActorIsolated() {
|
|
// CHECK: macro_expansion_expr
|
|
// CHECK: rewritten=current_context_isolation_expr
|
|
// CHECK-NEXT: inject_into_optional
|
|
// CHECK-NEXT: erasure_expr
|
|
// CHECK: member_ref_expr type="MainActor" location=@__swiftmacro_{{.*}} decl="_Concurrency.(file).MainActor.shared"
|
|
// CHECK-NEXT: type_expr implicit type="MainActor.Type"
|
|
_ = #isolation
|
|
}
|
|
|
|
func acceptClosure(_ body: () -> Void) { }
|
|
|
|
// CHECK-LABEL: closureIsolatedToOuterParam(
|
|
@available(SwiftStdlib 5.1, *)
|
|
func closureIsolatedToOuterParam(_ isolatedParam: isolated A) {
|
|
// CHECK: closure_expr
|
|
// CHECK: macro_expansion_expr
|
|
// CHECK: rewritten=current_context_isolation_expr
|
|
// CHECK-NEXT: inject_into_optional
|
|
// CHECK-NEXT: erasure_expr
|
|
// CHECK: declref_expr type="A"{{.*}}isolatedParam@
|
|
acceptClosure {
|
|
_ = #isolation
|
|
print(isolatedParam)
|
|
}
|
|
}
|
|
|
|
func acceptEscapingClosure(_ fn: @escaping () -> Void) { }
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
extension A {
|
|
func f() {
|
|
// Make sure this doesn't diagnose a use of implicit 'self'
|
|
acceptEscapingClosure {
|
|
_ = #isolation
|
|
self.g()
|
|
}
|
|
}
|
|
|
|
func g() {}
|
|
}
|
|
|
|
#if TEST_DIAGNOSTICS
|
|
@available(SwiftStdlib 5.1, *)
|
|
actor ConcreteActor {}
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
func concreteActorIsolation(
|
|
actor: isolated ConcreteActor = #isolation
|
|
) async {}
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
@MainActor
|
|
func testContextualType() {
|
|
let _: any Actor = #isolation
|
|
let _: MainActor = #isolation
|
|
let _: MainActor? = #isolation
|
|
|
|
// CHECK-DIAGS: error: cannot convert value of type 'MainActor' to expected argument type 'Int'
|
|
// CHECK-DIAGS: note: in expansion of macro 'isolation' here
|
|
// CHECK-DIAGS: let _: Int = #isolation
|
|
let _: Int = #isolation
|
|
|
|
// CHECK-DIAGS: error: cannot convert value of type 'MainActor' to expected argument type 'ConcreteActor'
|
|
// CHECK-DIAGS: note: in expansion of macro 'isolation' here
|
|
// CHECK-DIAGS: await concreteActorIsolation()
|
|
await concreteActorIsolation()
|
|
}
|
|
#endif
|
|
|
|
func isolationMacroDefault(
|
|
isolation: isolated (any Actor)? = #isolation,
|
|
) async -> Void {}
|
|
|
|
class C {
|
|
@globalActor
|
|
actor NestedActor {
|
|
static let shared = NestedActor()
|
|
}
|
|
|
|
@NestedActor
|
|
func expandIsolation() async {
|
|
await isolationMacroDefault()
|
|
}
|
|
}
|