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 @@ -5021,13 +5021,26 @@ getIsolationFromConformances(NominalTypeDecl *nominal) {
5021
5021
}
5022
5022
5023
5023
auto *proto = conformance->getProtocol ();
5024
- switch (auto protoIsolation = getActorIsolation (proto)) {
5024
+ auto inferredIsolation = getInferredActorIsolation (proto);
5025
+ auto protoIsolation = inferredIsolation.isolation ;
5026
+ switch (protoIsolation) {
5025
5027
case ActorIsolation::ActorInstance:
5026
5028
case ActorIsolation::Unspecified:
5027
- case ActorIsolation::Nonisolated:
5028
5029
case ActorIsolation::CallerIsolationInheriting:
5029
5030
case ActorIsolation::NonisolatedUnsafe:
5030
5031
break ;
5032
+ case ActorIsolation::Nonisolated:
5033
+ if (inferredIsolation.source .kind == IsolationSource::Kind::Explicit) {
5034
+ if (!foundIsolation) {
5035
+ // We found an explicitly 'nonisolated' protocol.
5036
+ foundIsolation = {
5037
+ protoIsolation,
5038
+ IsolationSource (proto, IsolationSource::Conformance)};
5039
+ }
5040
+ continue ;
5041
+ } else {
5042
+ break ;
5043
+ }
5031
5044
5032
5045
case ActorIsolation::Erased:
5033
5046
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