@@ -226,8 +226,8 @@ class DeclAttribute : public AttributeBase {
226226 isEarlyAdopter : 1
227227 );
228228
229- SWIFT_INLINE_BITFIELD (NonisolatedAttr, DeclAttribute, 1 ,
230- isUnsafe : 1
229+ SWIFT_INLINE_BITFIELD (NonisolatedAttr, DeclAttribute, NumNonIsolatedModifierBits ,
230+ Modifier : NumNonIsolatedModifierBits
231231 );
232232
233233 SWIFT_INLINE_BITFIELD_FULL (AllowFeatureSuppressionAttr, DeclAttribute, 1 +31 ,
@@ -2978,29 +2978,38 @@ class ObjCImplementationAttr final : public DeclAttribute {
29782978// / Represents nonisolated modifier.
29792979class NonisolatedAttr final : public DeclAttribute {
29802980public:
2981- NonisolatedAttr (SourceLoc atLoc, SourceRange range, bool unsafe,
2982- bool implicit)
2981+ NonisolatedAttr (SourceLoc atLoc, SourceRange range,
2982+ NonIsolatedModifier modifier, bool implicit)
29832983 : DeclAttribute(DeclAttrKind::Nonisolated, atLoc, range, implicit) {
2984- Bits.NonisolatedAttr .isUnsafe = unsafe;
2985- assert ((isUnsafe () == unsafe) && " not enough bits for unsafe state" );
2984+ Bits.NonisolatedAttr .Modifier = static_cast <unsigned >(modifier);
29862985 }
29872986
29882987 NonisolatedAttr (bool unsafe, bool implicit)
2989- : NonisolatedAttr({}, {}, unsafe, implicit) {}
2988+ : NonisolatedAttr({}, {},
2989+ unsafe ? NonIsolatedModifier::Unsafe
2990+ : NonIsolatedModifier::None,
2991+ implicit) {}
29902992
2991- bool isUnsafe () const { return Bits.NonisolatedAttr .isUnsafe ; }
2993+ NonIsolatedModifier getModifier () const {
2994+ return static_cast <NonIsolatedModifier>(Bits.NonisolatedAttr .Modifier );
2995+ }
2996+
2997+ bool isUnsafe () const { return getModifier () == NonIsolatedModifier::Unsafe; }
2998+ bool isNonSending () const {
2999+ return getModifier () == NonIsolatedModifier::NonSending;
3000+ }
29923001
29933002 static bool classof (const DeclAttribute *DA) {
29943003 return DA->getKind () == DeclAttrKind::Nonisolated;
29953004 }
29963005
29973006 // / Create a copy of this attribute.
29983007 NonisolatedAttr *clone (ASTContext &ctx) const {
2999- return new (ctx) NonisolatedAttr (AtLoc, Range, isUnsafe (), isImplicit ());
3008+ return new (ctx) NonisolatedAttr (AtLoc, Range, getModifier (), isImplicit ());
30003009 }
30013010
30023011 bool isEquivalent (const NonisolatedAttr *other, Decl *attachedTo) const {
3003- return isUnsafe () == other->isUnsafe ();
3012+ return getModifier () == other->getModifier ();
30043013 }
30053014};
30063015
0 commit comments