Skip to content

Commit a6d9c15

Browse files
committed
[Concurrency] Don't error on isolated property wrapper initializers inside
MainActor-isolated structs.
1 parent 4af5140 commit a6d9c15

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

include/swift/Basic/Features.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ EXPERIMENTAL_FEATURE_EXCLUDED_FROM_MODULE_INTERFACE(MemberImportVisibility, true
374374
EXPERIMENTAL_FEATURE(IsolatedAny2, true)
375375

376376
// Enable usability improvements for global-actor-isolated types.
377-
EXPERIMENTAL_FEATURE(GlobalActorIsolatedTypesUsability, false)
377+
EXPERIMENTAL_FEATURE(GlobalActorIsolatedTypesUsability, true)
378378

379379
// Enable @implementation on extensions of ObjC classes.
380380
EXPERIMENTAL_FEATURE(ObjCImplementation, true)

lib/Sema/TypeCheckConcurrency.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5117,17 +5117,6 @@ ActorIsolation ActorIsolationRequest::evaluate(
51175117
llvm_unreachable("cannot infer erased isolation");
51185118

51195119
case ActorIsolation::GlobalActor: {
5120-
// Stored properties of a struct don't need global-actor isolation.
5121-
if (ctx.isSwiftVersionAtLeast(6))
5122-
if (auto *var = dyn_cast<VarDecl>(value))
5123-
if (!var->isStatic() && var->isOrdinaryStoredProperty())
5124-
if (auto *varDC = var->getDeclContext())
5125-
if (auto *nominal = varDC->getSelfNominalTypeDecl())
5126-
if (isa<StructDecl>(nominal) &&
5127-
!isWrappedValueOfPropWrapper(var))
5128-
return ActorIsolation::forUnspecified().withPreconcurrency(
5129-
inferred.preconcurrency());
5130-
51315120
auto typeExpr =
51325121
TypeExpr::createImplicit(inferred.getGlobalActor(), ctx);
51335122
auto attr =

test/Concurrency/global_actor_inference_swift6.swift

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
// RUN: %target-swift-frontend -swift-version 6 -emit-module -emit-module-path %t/other_global_actor_inference.swiftmodule -module-name other_global_actor_inference -strict-concurrency=complete %S/Inputs/other_global_actor_inference.swift
44

5-
// RUN: %target-swift-frontend -swift-version 6 -I %t -disable-availability-checking %s -emit-sil -o /dev/null -verify
6-
// RUN: %target-swift-frontend -swift-version 6 -I %t -disable-availability-checking %s -emit-sil -o /dev/null -verify -enable-upcoming-feature RegionBasedIsolation
5+
// RUN: %target-swift-frontend -swift-version 6 -I %t -disable-availability-checking %s -emit-sil -o /dev/null -verify -enable-experimental-feature GlobalActorIsolatedTypesUsability
6+
// RUN: %target-swift-frontend -swift-version 6 -I %t -disable-availability-checking %s -emit-sil -o /dev/null -verify -enable-experimental-feature GlobalActorIsolatedTypesUsability
77

88
// REQUIRES: concurrency
99

@@ -132,3 +132,25 @@ struct Carbon {
132132
return atomicWeight // expected-error {{main actor-isolated property 'atomicWeight' can not be referenced from a non-isolated context}}
133133
}
134134
}
135+
136+
@MainActor
137+
protocol InferMainActor {}
138+
139+
@propertyWrapper
140+
@preconcurrency @MainActor
141+
struct Wrapper<T> {
142+
var wrappedValue: T {
143+
fatalError()
144+
}
145+
146+
init() {}
147+
}
148+
149+
@MainActor
150+
class C {
151+
nonisolated init() {}
152+
}
153+
154+
struct S: InferMainActor {
155+
@Wrapper var value: C // okay, 'S' is isolated to 'MainActor'
156+
}

0 commit comments

Comments
 (0)