File tree Expand file tree Collapse file tree 2 files changed +42
-3
lines changed Expand file tree Collapse file tree 2 files changed +42
-3
lines changed Original file line number Diff line number Diff line change @@ -5276,13 +5276,26 @@ getIsolationFromConformances(NominalTypeDecl *nominal) {
5276
5276
}
5277
5277
5278
5278
auto *proto = conformance->getProtocol ();
5279
- switch (auto protoIsolation = getActorIsolation (proto)) {
5279
+ auto inferredIsolation = getInferredActorIsolation (proto);
5280
+ auto protoIsolation = inferredIsolation.isolation ;
5281
+ switch (protoIsolation) {
5280
5282
case ActorIsolation::ActorInstance:
5281
5283
case ActorIsolation::Unspecified:
5282
- case ActorIsolation::Nonisolated:
5283
5284
case ActorIsolation::CallerIsolationInheriting:
5284
5285
case ActorIsolation::NonisolatedUnsafe:
5285
5286
break ;
5287
+ case ActorIsolation::Nonisolated:
5288
+ if (inferredIsolation.source .kind == IsolationSource::Kind::Explicit) {
5289
+ if (!foundIsolation) {
5290
+ // We found an explicitly 'nonisolated' protocol.
5291
+ foundIsolation = {
5292
+ protoIsolation,
5293
+ IsolationSource (proto, IsolationSource::Conformance)};
5294
+ }
5295
+ continue ;
5296
+ } else {
5297
+ break ;
5298
+ }
5286
5299
5287
5300
case ActorIsolation::Erased:
5288
5301
llvm_unreachable (" protocol cannot have erased isolation" );
Original file line number Diff line number Diff line change @@ -63,7 +63,7 @@ public struct PublicNonSendable {
63
63
}
64
64
65
65
66
- nonisolated struct NonisolatedStruct : GloballyIsolated {
66
+ nonisolated struct StructRemovesGlobalActor : GloballyIsolated {
67
67
var x : NonSendable
68
68
var y : Int = 1
69
69
@@ -106,6 +106,32 @@ struct A: Refined {
106
106
init ( x: NonSendable ) {
107
107
self . x = x // okay
108
108
}
109
+
110
+ init ( ) {
111
+ self . x = NonSendable ( )
112
+ }
113
+
114
+ func f( ) { }
115
+ }
116
+
117
+ @MainActor protocol ExplicitGlobalActor : Refined { }
118
+
119
+ struct IsolatedStruct : ExplicitGlobalActor {
120
+ // expected-note@+2 {{main actor isolation inferred from conformance to protocol 'ExplicitGlobalActor'}}
121
+ // expected-note@+1 {{calls to instance method 'g()' from outside of its actor context are implicitly asynchronous}}
122
+ func g( ) { }
123
+ }
124
+
125
+ struct NonisolatedStruct {
126
+ func callF( ) {
127
+ return A ( ) . f ( ) // okay, 'A' is non-isolated.
128
+ }
129
+
130
+ // expected-note@+1 {{add '@MainActor' to make instance method 'callG()' part of global actor 'MainActor'}}
131
+ func callG( ) {
132
+ // expected-error@+1{{call to main actor-isolated instance method 'g()' in a synchronous nonisolated context}}
133
+ return IsolatedStruct ( ) . g ( )
134
+ }
109
135
}
110
136
111
137
// MARK: - Extensions
You can’t perform that action at this time.
0 commit comments