@@ -147,7 +147,7 @@ class alignas(1 << DeclAlignInBits) ProtocolConformance
147147 SWIFT_INLINE_BITFIELD_EMPTY (RootProtocolConformance, ProtocolConformance);
148148
149149 SWIFT_INLINE_BITFIELD_FULL (NormalProtocolConformance, RootProtocolConformance,
150- 1 +1 +1 +
150+ 1 +1 +1 +1 + 1 +
151151 bitmax (NumProtocolConformanceOptions,8 )+
152152 bitmax (NumProtocolConformanceStateBits,8 )+
153153 bitmax (NumConformanceEntryKindBits,8 ),
@@ -161,6 +161,12 @@ class alignas(1 << DeclAlignInBits) ProtocolConformance
161161 // / this conformance.
162162 IsPreconcurrencyEffectful : 1 ,
163163
164+ // / Whether the computed actor isolation is nonisolated.
165+ IsComputedNonisolated : 1 ,
166+
167+ // / Whether there is an explicit global actor specified for this
168+ // / conformance.
169+ HasExplicitGlobalActor : 1 ,
164170 : NumPadBits,
165171
166172 // / Options.
@@ -240,6 +246,14 @@ class alignas(1 << DeclAlignInBits) ProtocolConformance
240246 // / Otherwise a new conformance will be created.
241247 ProtocolConformance *getCanonicalConformance ();
242248
249+ // / Determine the actor isolation of this conformance.
250+ ActorIsolation getIsolation () const ;
251+
252+ // / Determine whether this conformance is isolated to an actor.
253+ bool isIsolated () const {
254+ return getIsolation ().isActorIsolated ();
255+ }
256+
243257 // / Return true if the conformance has a witness for the given associated
244258 // / type.
245259 bool hasTypeWitness (AssociatedTypeDecl *assocType) const ;
@@ -529,6 +543,7 @@ class NormalProtocolConformance : public RootProtocolConformance,
529543{
530544 friend class ValueWitnessRequest ;
531545 friend class TypeWitnessRequest ;
546+ friend class ConformanceIsolationRequest ;
532547
533548 // / The protocol being conformed to.
534549 ProtocolDecl *Protocol;
@@ -570,6 +585,20 @@ class NormalProtocolConformance : public RootProtocolConformance,
570585
571586 void resolveLazyInfo () const ;
572587
588+ // / Retrieve the explicitly-specified global actor isolation.
589+ TypeExpr *getExplicitGlobalActorIsolation () const ;
590+
591+ // Record the explicitly-specified global actor isolation.
592+ void setExplicitGlobalActorIsolation (TypeExpr *typeExpr);
593+
594+ bool isComputedNonisolated () const {
595+ return Bits.NormalProtocolConformance .IsComputedNonisolated ;
596+ }
597+
598+ void setComputedNonnisolated (bool value = true ) {
599+ Bits.NormalProtocolConformance .IsComputedNonisolated = value;
600+ }
601+
573602public:
574603 NormalProtocolConformance (Type conformingType, ProtocolDecl *protocol,
575604 SourceLoc loc, DeclContext *dc,
@@ -593,6 +622,9 @@ class NormalProtocolConformance : public RootProtocolConformance,
593622 Bits.NormalProtocolConformance .HasComputedAssociatedConformances = false ;
594623 Bits.NormalProtocolConformance .SourceKind =
595624 unsigned (ConformanceEntryKind::Explicit);
625+ Bits.NormalProtocolConformance .IsComputedNonisolated = false ;
626+ Bits.NormalProtocolConformance .HasExplicitGlobalActor = false ;
627+ setExplicitGlobalActorIsolation (options.getGlobalActorIsolationType ());
596628 }
597629
598630 // / Get the protocol being conformed to.
@@ -634,7 +666,8 @@ class NormalProtocolConformance : public RootProtocolConformance,
634666 void setInvalid () { Bits.NormalProtocolConformance .IsInvalid = true ; }
635667
636668 ProtocolConformanceOptions getOptions () const {
637- return ProtocolConformanceOptions (Bits.NormalProtocolConformance .Options );
669+ return ProtocolConformanceOptions (Bits.NormalProtocolConformance .Options ,
670+ getExplicitGlobalActorIsolation ());
638671 }
639672
640673 // / Whether this is an "unchecked" conformance.
@@ -669,11 +702,6 @@ class NormalProtocolConformance : public RootProtocolConformance,
669702 return getOptions ().contains (ProtocolConformanceFlags::Preconcurrency);
670703 }
671704
672- // / Whether this is an isolated conformance.
673- bool isIsolated () const {
674- return getOptions ().contains (ProtocolConformanceFlags::Isolated);
675- }
676-
677705 // / Retrieve the location of `@preconcurrency`, if there is one and it is
678706 // / known.
679707 SourceLoc getPreconcurrencyLoc () const { return PreconcurrencyLoc; }
0 commit comments