Skip to content

[6.2][SE-0461] Replace @execution(...) with @concurrent and nonisolated(nonsending) #80807

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Apr 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/ABI/Mangling.rst
Original file line number Diff line number Diff line change
Expand Up @@ -761,7 +761,7 @@ Types
sending-result ::= 'YT' // -> sending T
#endif
#if SWIFT_RUNTIME_VERSION >= 6.2
function-isolation :== 'YC' // @execution(caller) on function type
function-isolation :== 'YC' // nonisolated(nonsending) on function type
#endif
differentiable ::= 'Yjf' // @differentiable(_forward) on function type
differentiable ::= 'Yjr' // @differentiable(reverse) on function type
Expand Down
40 changes: 15 additions & 25 deletions include/swift/AST/ASTBridging.h
Original file line number Diff line number Diff line change
Expand Up @@ -910,16 +910,6 @@ void BridgedAvailableAttr_setIsGroupedWithWildcard(BridgedAvailableAttr cAttr);
SWIFT_NAME("BridgedAvailableAttr.setIsGroupTerminator(self:)")
void BridgedAvailableAttr_setIsGroupTerminator(BridgedAvailableAttr cAttr);

enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedExecutionKind {
BridgedExecutionKindConcurrent,
BridgedExecutionKindCaller,
};

SWIFT_NAME("BridgedExecutionAttr.createParsed(_:atLoc:range:behavior:)")
BridgedExecutionAttr BridgedExecutionAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc atLoc,
BridgedSourceRange range, BridgedExecutionKind behavior);

enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedAccessLevel {
BridgedAccessLevelPrivate,
BridgedAccessLevelFilePrivate,
Expand Down Expand Up @@ -1235,11 +1225,18 @@ BridgedNonSendableAttr BridgedNonSendableAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedNonSendableKind cKind);

SWIFT_NAME("BridgedNonisolatedAttr.createParsed(_:atLoc:range:isUnsafe:)")
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedNonIsolatedModifier {
BridgedNonIsolatedModifierNone,
BridgedNonIsolatedModifierUnsafe,
BridgedNonIsolatedModifierNonSending
};

SWIFT_NAME("BridgedNonisolatedAttr.createParsed(_:atLoc:range:modifier:)")
BridgedNonisolatedAttr
BridgedNonisolatedAttr_createParsed(BridgedASTContext cContext,
BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, bool isUnsafe);
BridgedSourceRange cRange,
BridgedNonIsolatedModifier modifier);

SWIFT_NAME("BridgedObjCAttr.createParsedUnnamed(_:atLoc:attrNameLoc:)")
BridgedObjCAttr
Expand Down Expand Up @@ -2590,26 +2587,13 @@ BridgedConventionTypeAttr BridgedConventionTypeAttr_createParsed(
BridgedSourceLoc cNameLoc, BridgedDeclNameRef cWitnessMethodProtocol,
BridgedStringRef cClangType, BridgedSourceLoc cClangTypeLoc);

enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedExecutionTypeAttrExecutionKind {
BridgedExecutionTypeAttrExecutionKind_Concurrent,
BridgedExecutionTypeAttrExecutionKind_Caller
};

SWIFT_NAME("BridgedDifferentiableTypeAttr.createParsed(_:atLoc:nameLoc:"
"parensRange:kind:kindLoc:)")
BridgedDifferentiableTypeAttr BridgedDifferentiableTypeAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceLoc cNameLoc, BridgedSourceRange cParensRange,
BridgedDifferentiabilityKind cKind, BridgedSourceLoc cKindLoc);

SWIFT_NAME("BridgedExecutionTypeAttr.createParsed(_:atLoc:nameLoc:parensRange:"
"behavior:behaviorLoc:)")
BridgedExecutionTypeAttr BridgedExecutionTypeAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceLoc cNameLoc, BridgedSourceRange cParensRange,
BridgedExecutionTypeAttrExecutionKind behavior,
BridgedSourceLoc cBehaviorLoc);

SWIFT_NAME("BridgedIsolatedTypeAttr.createParsed(_:atLoc:nameLoc:parensRange:"
"isolationKind:isolationKindLoc:)")
BridgedIsolatedTypeAttr BridgedIsolatedTypeAttr_createParsed(
Expand Down Expand Up @@ -2777,6 +2761,12 @@ BridgedSendingTypeRepr_createParsed(BridgedASTContext cContext,
BridgedTypeRepr base,
BridgedSourceLoc cSpecifierLoc);

SWIFT_NAME("BridgedCallerIsolatedTypeRepr.createParsed(_:base:specifierLoc:)")
BridgedCallerIsolatedTypeRepr
BridgedCallerIsolatedTypeRepr_createParsed(BridgedASTContext cContext,
BridgedTypeRepr base,
BridgedSourceLoc cSpecifierLoc);

SWIFT_NAME(
"BridgedTupleTypeRepr.createParsed(_:elements:leftParenLoc:rightParenLoc:)")
BridgedTupleTypeRepr BridgedTupleTypeRepr_createParsed(
Expand Down
91 changes: 22 additions & 69 deletions include/swift/AST/Attr.h
Original file line number Diff line number Diff line change
Expand Up @@ -226,8 +226,8 @@ class DeclAttribute : public AttributeBase {
isEarlyAdopter : 1
);

SWIFT_INLINE_BITFIELD(NonisolatedAttr, DeclAttribute, 1,
isUnsafe : 1
SWIFT_INLINE_BITFIELD(NonisolatedAttr, DeclAttribute, NumNonIsolatedModifierBits,
Modifier : NumNonIsolatedModifierBits
);

SWIFT_INLINE_BITFIELD_FULL(AllowFeatureSuppressionAttr, DeclAttribute, 1+31,
Expand All @@ -236,10 +236,6 @@ class DeclAttribute : public AttributeBase {

NumFeatures : 31
);

SWIFT_INLINE_BITFIELD(ExecutionAttr, DeclAttribute, NumExecutionKindBits,
Behavior : NumExecutionKindBits
);
} Bits;
// clang-format on

Expand Down Expand Up @@ -2978,29 +2974,40 @@ class ObjCImplementationAttr final : public DeclAttribute {
/// Represents nonisolated modifier.
class NonisolatedAttr final : public DeclAttribute {
public:
NonisolatedAttr(SourceLoc atLoc, SourceRange range, bool unsafe,
bool implicit)
NonisolatedAttr(SourceLoc atLoc, SourceRange range,
NonIsolatedModifier modifier, bool implicit)
: DeclAttribute(DeclAttrKind::Nonisolated, atLoc, range, implicit) {
Bits.NonisolatedAttr.isUnsafe = unsafe;
assert((isUnsafe() == unsafe) && "not enough bits for unsafe state");
Bits.NonisolatedAttr.Modifier = static_cast<unsigned>(modifier);
assert((getModifier() == modifier) && "not enough bits for modifier");
}

NonisolatedAttr(bool unsafe, bool implicit)
: NonisolatedAttr({}, {}, unsafe, implicit) {}
NonIsolatedModifier getModifier() const {
return static_cast<NonIsolatedModifier>(Bits.NonisolatedAttr.Modifier);
}

bool isUnsafe() const { return Bits.NonisolatedAttr.isUnsafe; }
bool isUnsafe() const { return getModifier() == NonIsolatedModifier::Unsafe; }
bool isNonSending() const {
return getModifier() == NonIsolatedModifier::NonSending;
}

static NonisolatedAttr *
createImplicit(ASTContext &ctx,
NonIsolatedModifier modifier = NonIsolatedModifier::None) {
return new (ctx) NonisolatedAttr(/*atLoc*/ {}, /*range*/ {}, modifier,
/*implicit=*/true);
}

static bool classof(const DeclAttribute *DA) {
return DA->getKind() == DeclAttrKind::Nonisolated;
}

/// Create a copy of this attribute.
NonisolatedAttr *clone(ASTContext &ctx) const {
return new (ctx) NonisolatedAttr(AtLoc, Range, isUnsafe(), isImplicit());
return new (ctx) NonisolatedAttr(AtLoc, Range, getModifier(), isImplicit());
}

bool isEquivalent(const NonisolatedAttr *other, Decl *attachedTo) const {
return isUnsafe() == other->isUnsafe();
return getModifier() == other->getModifier();
}
};

Expand Down Expand Up @@ -3275,34 +3282,6 @@ class ABIAttr : public DeclAttribute {
}
};

class ExecutionAttr : public DeclAttribute {
public:
ExecutionAttr(SourceLoc AtLoc, SourceRange Range,
ExecutionKind behavior,
bool Implicit)
: DeclAttribute(DeclAttrKind::Execution, AtLoc, Range, Implicit) {
Bits.ExecutionAttr.Behavior = static_cast<uint8_t>(behavior);
}

ExecutionAttr(ExecutionKind behavior, bool Implicit)
: ExecutionAttr(/*AtLoc=*/SourceLoc(), /*Range=*/SourceRange(), behavior,
Implicit) {}

ExecutionKind getBehavior() const {
return static_cast<ExecutionKind>(Bits.ExecutionAttr.Behavior);
}

static bool classof(const DeclAttribute *DA) {
return DA->getKind() == DeclAttrKind::Execution;
}

UNIMPLEMENTED_CLONE(ExecutionAttr)

bool isEquivalent(const ExecutionAttr *other, Decl *attachedTo) const {
return getBehavior() == other->getBehavior();
}
};

/// Attributes that may be applied to declarations.
class DeclAttributes {
/// Linked list of declaration attributes.
Expand Down Expand Up @@ -3762,10 +3741,6 @@ class alignas(1 << AttrAlignInBits) TypeAttribute
SWIFT_INLINE_BITFIELD_FULL(IsolatedTypeAttr, TypeAttribute, 8,
Kind : 8
);

SWIFT_INLINE_BITFIELD_FULL(ExecutionTypeAttr, TypeAttribute, 8,
Behavior : 8
);
} Bits;
// clang-format on

Expand Down Expand Up @@ -4033,28 +4008,6 @@ class IsolatedTypeAttr : public SimpleTypeAttrWithArgs<TypeAttrKind::Isolated> {
void printImpl(ASTPrinter &printer, const PrintOptions &options) const;
};

/// The @execution function type attribute.
class ExecutionTypeAttr : public SimpleTypeAttrWithArgs<TypeAttrKind::Execution> {
SourceLoc BehaviorLoc;

public:
ExecutionTypeAttr(SourceLoc atLoc, SourceLoc kwLoc, SourceRange parensRange,
Located<ExecutionKind> behavior)
: SimpleTypeAttr(atLoc, kwLoc, parensRange), BehaviorLoc(behavior.Loc) {
Bits.ExecutionTypeAttr.Behavior = uint8_t(behavior.Item);
}

ExecutionKind getBehavior() const {
return ExecutionKind(Bits.ExecutionTypeAttr.Behavior);
}

SourceLoc getBehaviorLoc() const {
return BehaviorLoc;
}

void printImpl(ASTPrinter &printer, const PrintOptions &options) const;
};

using TypeOrCustomAttr =
llvm::PointerUnion<CustomAttr*, TypeAttribute*>;

Expand Down
15 changes: 9 additions & 6 deletions include/swift/AST/AttrKind.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,14 +130,17 @@ enum class ExternKind: uint8_t {
enum : unsigned { NumExternKindBits =
countBitsUsed(static_cast<unsigned>(ExternKind::Last_ExternKind)) };

enum class ExecutionKind : uint8_t {
Concurrent = 0,
Caller,
Last_ExecutionKind = Caller
enum class NonIsolatedModifier : uint8_t {
None = 0,
Unsafe,
NonSending,
Last_NonIsolatedModifier = NonSending
};

enum : unsigned { NumExecutionKindBits =
countBitsUsed(static_cast<unsigned>(ExecutionKind::Last_ExecutionKind)) };
enum : unsigned {
NumNonIsolatedModifierBits = countBitsUsed(
static_cast<unsigned>(NonIsolatedModifier::Last_NonIsolatedModifier))
};

enum class DeclAttrKind : unsigned {
#define DECL_ATTR(_, CLASS, ...) CLASS,
Expand Down
2 changes: 0 additions & 2 deletions include/swift/AST/Decl.h
Original file line number Diff line number Diff line change
Expand Up @@ -8149,8 +8149,6 @@ class AbstractFunctionDecl : public GenericContext, public ValueDecl {
return cast_or_null<AbstractFunctionDecl>(ValueDecl::getOverriddenDecl());
}

std::optional<ExecutionKind> getExecutionBehavior() const;

/// Whether the declaration is later overridden in the module
///
/// Overrides are resolved during type checking; only query this field after
Expand Down
13 changes: 7 additions & 6 deletions include/swift/AST/DeclAttr.def
Original file line number Diff line number Diff line change
Expand Up @@ -862,11 +862,7 @@ DECL_ATTR(abi, ABI,
165)
DECL_ATTR_FEATURE_REQUIREMENT(ABI, ABIAttribute)

DECL_ATTR(execution, Execution,
OnFunc | OnConstructor | OnSubscript | OnVar,
ABIBreakingToAdd | ABIBreakingToRemove | APIBreakingToAdd | APIBreakingToRemove | UnconstrainedInABIAttr,
166)
DECL_ATTR_FEATURE_REQUIREMENT(Execution, ExecutionAttribute)
// Unused '166': Used to be `@execution(caller | concurrent)` replaced with `@concurrent` and `nonisolated(nonsending)`

SIMPLE_DECL_ATTR(const, ConstVal,
OnParam | OnVar | OnFunc,
Expand All @@ -879,7 +875,12 @@ SIMPLE_DECL_ATTR(constInitialized, ConstInitialized,
168)
DECL_ATTR_FEATURE_REQUIREMENT(ConstInitialized, CompileTimeValues)

LAST_DECL_ATTR(ConstInitialized)
SIMPLE_DECL_ATTR(concurrent, Concurrent,
OnFunc | OnConstructor | OnSubscript | OnVar,
ABIBreakingToAdd | ABIBreakingToRemove | APIBreakingToAdd | APIBreakingToRemove | UnconstrainedInABIAttr,
170)

LAST_DECL_ATTR(Concurrent)

#undef DECL_ATTR_ALIAS
#undef CONTEXTUAL_DECL_ATTR_ALIAS
Expand Down
21 changes: 13 additions & 8 deletions include/swift/AST/DiagnosticsParse.def
Original file line number Diff line number Diff line change
Expand Up @@ -1697,14 +1697,6 @@ ERROR(attr_isolated_expected_rparen,none,
ERROR(attr_isolated_expected_kind,none,
"expected 'any' as the isolation kind", ())

ERROR(attr_execution_expected_lparen,none,
"expected '(' after '@execution'",
())
ERROR(attr_execution_expected_rparen,none,
"expected ')' after execution behavior", ())
ERROR(attr_execution_expected_kind,none,
"expected 'concurrent' or 'caller' as the execution behavior", ())

ERROR(attr_private_import_expected_rparen,none,
"expected ')' after function name for @_private", ())
ERROR(attr_private_import_expected_sourcefile, none,
Expand Down Expand Up @@ -2169,5 +2161,18 @@ ERROR(sil_thunkinst_failed_to_parse_kind,none,
ERROR(sil_failed_to_parse_sil_optional,none,
"Expected SIL optional value of the form '[' NAME ']'", ())

//------------------------------------------------------------------------------
// MARK: nonisolated(nonsending)
//------------------------------------------------------------------------------

ERROR(nonisolated_nonsending_expected_lparen,PointsToFirstBadToken,
"expected '(' following 'nonisolated'", ())
ERROR(nonisolated_nonsending_incorrect_modifier,PointsToFirstBadToken,
"expected 'nonsending' in modifier", ())
ERROR(nonisolated_nonsending_expected_rparen,PointsToFirstBadToken,
"expected ')' after 'nonisolated' modifier", ())
ERROR(nonisolated_nonsending_repeated,none,
"parameter may have at most one 'nonisolated(nonsending)' specifier", ())

#define UNDEFINE_DIAGNOSTIC_MACROS
#include "DefineDiagnosticMacros.h"
Loading