Skip to content

Commit d8c64c1

Browse files
committed
[AST/Sema] Intoduce nonisolated(nonsending) as a replacement for @execution(caller)
1 parent 4a973f7 commit d8c64c1

20 files changed

+310
-203
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1234,11 +1234,18 @@ BridgedNonSendableAttr BridgedNonSendableAttr_createParsed(
12341234
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
12351235
BridgedSourceRange cRange, BridgedNonSendableKind cKind);
12361236

1237-
SWIFT_NAME("BridgedNonisolatedAttr.createParsed(_:atLoc:range:isUnsafe:)")
1237+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedNonIsolatedModifier {
1238+
BridgedNonIsolatedModifierNone,
1239+
BridgedNonIsolatedModifierUnsafe,
1240+
BridgedNonIsolatedModifierNonSending
1241+
};
1242+
1243+
SWIFT_NAME("BridgedNonisolatedAttr.createParsed(_:atLoc:range:modifier:)")
12381244
BridgedNonisolatedAttr
12391245
BridgedNonisolatedAttr_createParsed(BridgedASTContext cContext,
12401246
BridgedSourceLoc cAtLoc,
1241-
BridgedSourceRange cRange, bool isUnsafe);
1247+
BridgedSourceRange cRange,
1248+
BridgedNonIsolatedModifier modifier);
12421249

12431250
SWIFT_NAME("BridgedObjCAttr.createParsedUnnamed(_:atLoc:attrNameLoc:)")
12441251
BridgedObjCAttr

include/swift/AST/Attr.h

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
29792979
class NonisolatedAttr final : public DeclAttribute {
29802980
public:
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

include/swift/AST/AttrKind.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,18 @@ enum class ExecutionKind : uint8_t {
138138
enum : unsigned { NumExecutionKindBits =
139139
countBitsUsed(static_cast<unsigned>(ExecutionKind::Last_ExecutionKind)) };
140140

141+
enum class NonIsolatedModifier : uint8_t {
142+
None = 0,
143+
Unsafe,
144+
NonSending,
145+
Last_NonIsolatedModifier = NonSending
146+
};
147+
148+
enum : unsigned {
149+
NumNonIsolatedModifierBits = countBitsUsed(
150+
static_cast<unsigned>(NonIsolatedModifier::Last_NonIsolatedModifier))
151+
};
152+
141153
enum class DeclAttrKind : unsigned {
142154
#define DECL_ATTR(_, CLASS, ...) CLASS,
143155
#define LAST_DECL_ATTR(CLASS) Last_DeclAttr = CLASS,

include/swift/AST/DiagnosticsSema.def

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8514,33 +8514,38 @@ GROUPED_ERROR(isolated_conformance_wrong_domain,IsolatedConformances,none,
85148514
//===----------------------------------------------------------------------===//
85158515
85168516
ERROR(execution_behavior_only_on_async,none,
8517-
"cannot use '%0' on non-async %kind1",
8517+
"cannot use %0 on non-async %kind1",
85188518
(DeclAttribute, ValueDecl *))
85198519
8520+
ERROR(cannot_specify_execution_behavior_for_decl,none,
8521+
"%0 is only applicable to asynchronous functions, "
8522+
"initializers, subscripts and computed properties",
8523+
(DeclAttribute))
8524+
85208525
ERROR(execution_behavior_only_on_async_closure,none,
8521-
"cannot use '%0' on non-async closure",
8526+
"cannot use %0 on non-async closure",
85228527
(DeclAttribute))
85238528
85248529
ERROR(execution_behavior_type_attr_only_on_async,none,
85258530
"cannot use '@%0' on non-async function type",
85268531
(StringRef))
85278532
85288533
ERROR(execution_behavior_incompatible_isolated_parameter,none,
8529-
"cannot use '%0' on %kind1 because it has "
8534+
"cannot use %0 on %kind1 because it has "
85308535
"an isolated parameter: %2",
85318536
(DeclAttribute, ValueDecl *, ValueDecl *))
85328537
85338538
ERROR(execution_behavior_incompatible_dynamically_isolated_parameter,none,
8534-
"cannot use '%0' on %kind1 because it has "
8539+
"cannot use %0 on %kind1 because it has "
85358540
"a dynamically isolated parameter: %2",
85368541
(DeclAttribute, ValueDecl *, ValueDecl *))
85378542
85388543
ERROR(execution_behavior_attr_incompatible_with_global_isolation,none,
8539-
"cannot use '%0' because function type is isolated to a global actor %1",
8544+
"cannot use %0 because function type is isolated to a global actor %1",
85408545
(DeclAttribute, Type))
85418546
85428547
ERROR(execution_behavior_attr_incompatible_with_isolated_param,none,
8543-
"cannot use '%0' together with an isolated parameter",
8548+
"cannot use %0 together with an isolated parameter",
85448549
(DeclAttribute))
85458550
85468551
ERROR(execution_behavior_type_attr_incompatible_with_global_isolation,none,

include/swift/AST/KnownIdentifiers.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ IDENTIFIER(main)
127127
IDENTIFIER_WITH_NAME(MainEntryPoint, "$main")
128128
IDENTIFIER(message)
129129
IDENTIFIER(next)
130+
IDENTIFIER(nonsending)
130131
IDENTIFIER_(nsErrorDomain)
131132
IDENTIFIER(objectAtIndexedSubscript)
132133
IDENTIFIER(objectForKeyedSubscript)

lib/AST/ASTDumper.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2389,6 +2389,8 @@ namespace {
23892389
VD->getAttrs().getAttribute<NonisolatedAttr>()) {
23902390
if (nonisolatedAttr->isUnsafe()) {
23912391
printFlag(true, "nonisolated(unsafe)", DeclModifierColor);
2392+
} else if (nonisolatedAttr->isNonSending()) {
2393+
printFlag(true, "nonisolated(nonsending)", DeclModifierColor);
23922394
} else {
23932395
printFlag(true, "nonisolated", DeclModifierColor);
23942396
}
@@ -5182,6 +5184,7 @@ class PrintAttribute : public AttributeVisitor<PrintAttribute, void, Label>,
51825184
void visitNonisolatedAttr(NonisolatedAttr *Attr, Label label) {
51835185
printCommon(Attr, "nonisolated_attr", label);
51845186
printFlag(Attr->isUnsafe(), "unsafe");
5187+
printFlag(Attr->isNonSending(), "nonsending");
51855188
printFoot();
51865189
}
51875190
void visitObjCAttr(ObjCAttr *Attr, Label label) {

lib/AST/Attr.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1535,8 +1535,15 @@ bool DeclAttribute::printImpl(ASTPrinter &Printer, const PrintOptions &Options,
15351535

15361536
case DeclAttrKind::Nonisolated: {
15371537
Printer.printAttrName("nonisolated");
1538-
if (cast<NonisolatedAttr>(this)->isUnsafe()) {
1538+
switch (cast<NonisolatedAttr>(this)->getModifier()) {
1539+
case NonIsolatedModifier::None:
1540+
break;
1541+
case NonIsolatedModifier::Unsafe:
15391542
Printer << "(unsafe)";
1543+
break;
1544+
case NonIsolatedModifier::NonSending:
1545+
Printer << "(nonsending)";
1546+
break;
15401547
}
15411548
break;
15421549
}
@@ -1925,10 +1932,13 @@ StringRef DeclAttribute::getAttrName() const {
19251932
case DeclAttrKind::Documentation:
19261933
return "_documentation";
19271934
case DeclAttrKind::Nonisolated:
1928-
if (cast<NonisolatedAttr>(this)->isUnsafe()) {
1929-
return "nonisolated(unsafe)";
1930-
} else {
1931-
return "nonisolated";
1935+
switch (cast<NonisolatedAttr>(this)->getModifier()) {
1936+
case NonIsolatedModifier::None:
1937+
return "nonisolated";
1938+
case NonIsolatedModifier::Unsafe:
1939+
return "nonisolated(unsafe)";
1940+
case NonIsolatedModifier::NonSending:
1941+
return "nonisolated(nonsending)";
19321942
}
19331943
case DeclAttrKind::MacroRole:
19341944
switch (cast<MacroRoleAttr>(this)->getMacroSyntax()) {

lib/AST/Bridging/DeclAttributeBridging.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -627,12 +627,26 @@ BridgedNonSendableAttr BridgedNonSendableAttr_createParsed(
627627
NonSendableAttr(cAtLoc.unbridged(), cRange.unbridged(), unbridged(cKind));
628628
}
629629

630+
static NonIsolatedModifier unbridged(BridgedNonIsolatedModifier modifier) {
631+
switch (modifier) {
632+
case BridgedNonIsolatedModifierNone:
633+
return NonIsolatedModifier::None;
634+
case BridgedNonIsolatedModifierUnsafe:
635+
return NonIsolatedModifier::Unsafe;
636+
case BridgedNonIsolatedModifierNonSending:
637+
return NonIsolatedModifier::NonSending;
638+
}
639+
llvm_unreachable("unhandled enum value");
640+
}
641+
630642
BridgedNonisolatedAttr
631643
BridgedNonisolatedAttr_createParsed(BridgedASTContext cContext,
632644
BridgedSourceLoc cAtLoc,
633-
BridgedSourceRange cRange, bool isUnsafe) {
645+
BridgedSourceRange cRange,
646+
BridgedNonIsolatedModifier modifier) {
634647
return new (cContext.unbridged()) NonisolatedAttr(
635-
cAtLoc.unbridged(), cRange.unbridged(), isUnsafe, /*implicit=*/false);
648+
cAtLoc.unbridged(), cRange.unbridged(), unbridged(modifier),
649+
/*implicit=*/false);
636650
}
637651

638652
BridgedObjCAttr

lib/AST/Decl.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8757,6 +8757,11 @@ void VarDecl::emitLetToVarNoteIfSimple(DeclContext *UseDC) const {
87578757

87588758
std::optional<ExecutionKind>
87598759
AbstractFunctionDecl::getExecutionBehavior() const {
8760+
if (auto *nonisolatedAttr = getAttrs().getAttribute<NonisolatedAttr>()) {
8761+
if (nonisolatedAttr->isNonSending())
8762+
return ExecutionKind::Caller;
8763+
}
8764+
87608765
auto *attr = getAttrs().getAttribute<ExecutionAttr>();
87618766
if (!attr)
87628767
return {};

lib/ASTGen/Sources/ASTGen/DeclAttrs.swift

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,27 +1415,25 @@ extension ASTGenVisitor {
14151415

14161416
// FIXME: This is a decl modifier
14171417
func generateNonisolatedAttr(attribute node: AttributeSyntax) -> BridgedNonisolatedAttr? {
1418-
let isUnsafe = self.generateSingleAttrOption(
1418+
let modifier: BridgedNonIsolatedModifier? = self.generateSingleAttrOption(
14191419
attribute: node,
14201420
{
14211421
switch $0.rawText {
1422-
case "unsafe":
1423-
return true
1424-
default:
1425-
// FIXME: Diagnose.
1426-
return nil
1422+
case "unsafe": return .unsafe
1423+
case "nonsending": return .nonSending
1424+
default: return nil
14271425
}
14281426
},
1429-
valueIfOmitted: false
1427+
valueIfOmitted: BridgedNonIsolatedModifier.none
14301428
)
1431-
guard let isUnsafe else {
1429+
guard let modifier else {
14321430
return nil
14331431
}
14341432
return .createParsed(
14351433
self.ctx,
14361434
atLoc: self.generateSourceLoc(node.atSign),
14371435
range: self.generateAttrSourceRange(node),
1438-
isUnsafe: isUnsafe
1436+
modifier: modifier
14391437
)
14401438
}
14411439

@@ -2409,12 +2407,14 @@ extension ASTGenVisitor {
24092407
}
24102408

24112409
func generateNonisolatedAttr(declModifier node: DeclModifierSyntax) -> BridgedNonisolatedAttr? {
2412-
let isUnsafe: Bool
2410+
let modifier: BridgedNonIsolatedModifier
24132411
switch node.detail?.detail.rawText {
24142412
case "unsafe":
2415-
isUnsafe = true
2413+
modifier = .unsafe
2414+
case "nonsending":
2415+
modifier = .nonSending
24162416
case nil:
2417-
isUnsafe = false
2417+
modifier = .none
24182418
case let text?:
24192419
// TODO: Diagnose
24202420
_ = text
@@ -2425,7 +2425,7 @@ extension ASTGenVisitor {
24252425
self.ctx,
24262426
atLoc: nil,
24272427
range: self.generateSourceRange(node),
2428-
isUnsafe: isUnsafe
2428+
modifier: modifier
24292429
)
24302430
}
24312431

0 commit comments

Comments
 (0)