Skip to content

Commit 9719cd0

Browse files
committed
[AST] InitAccessors: Introduce new @storageRestrictions(initializes:accesses:) attribute
This is the replacement for `initializes`, `accesses` attributes.
1 parent b03d8df commit 9719cd0

File tree

6 files changed

+78
-0
lines changed

6 files changed

+78
-0
lines changed

include/swift/AST/Attr.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1617,6 +1617,45 @@ class AccessesAttr final
16171617
}
16181618
};
16191619

1620+
class StorageRestrictionsAttr final
1621+
: public DeclAttribute,
1622+
private llvm::TrailingObjects<StorageRestrictionsAttr, Identifier> {
1623+
friend TrailingObjects;
1624+
1625+
size_t NumInitializes;
1626+
size_t NumAccesses;
1627+
1628+
size_t numTrailingObjects(OverloadToken<Identifier>) const {
1629+
return NumInitializes + NumAccesses;
1630+
}
1631+
1632+
public:
1633+
StorageRestrictionsAttr(SourceLoc AtLoc, SourceRange Range,
1634+
ArrayRef<Identifier> initializes,
1635+
ArrayRef<Identifier> accesses, bool Implicit);
1636+
1637+
unsigned getNumInitializesProperties() const { return NumInitializes; }
1638+
1639+
unsigned getNumAccessesProperties() const { return NumAccesses; }
1640+
1641+
ArrayRef<Identifier> getInitializesNames() const {
1642+
return {getTrailingObjects<Identifier>(), NumInitializes};
1643+
}
1644+
1645+
ArrayRef<Identifier> getAccessesNames() const {
1646+
return {getTrailingObjects<Identifier>() + NumInitializes, NumAccesses};
1647+
}
1648+
1649+
static StorageRestrictionsAttr *create(ASTContext &ctx, SourceLoc atLoc,
1650+
SourceRange range,
1651+
ArrayRef<Identifier> initializes,
1652+
ArrayRef<Identifier> accesses);
1653+
1654+
static bool classof(const DeclAttribute *DA) {
1655+
return DA->getKind() == DAK_StorageRestrictions;
1656+
}
1657+
};
1658+
16201659
/// The @_implements attribute, which treats a decl as the implementation for
16211660
/// some named protocol requirement (but otherwise not-visible by that name).
16221661
class ImplementsAttr : public DeclAttribute {

lib/AST/Attr.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1600,6 +1600,8 @@ StringRef DeclAttribute::getAttrName() const {
16001600
return "initializes";
16011601
case DAK_Accesses:
16021602
return "accesses";
1603+
case DAK_StorageRestrictions:
1604+
return "storageRestrictions";
16031605
case DAK_Implements:
16041606
return "_implements";
16051607
case DAK_ClangImporterSynthesizedType:
@@ -2405,6 +2407,29 @@ AccessesAttr::create(ASTContext &ctx, SourceLoc atLoc, SourceRange range,
24052407
return new (mem) AccessesAttr(atLoc, range, properties);
24062408
}
24072409

2410+
StorageRestrictionsAttr::StorageRestrictionsAttr(
2411+
SourceLoc AtLoc, SourceRange Range, ArrayRef<Identifier> initializes,
2412+
ArrayRef<Identifier> accesses, bool Implicit)
2413+
: DeclAttribute(DAK_StorageRestrictions, AtLoc, Range, Implicit),
2414+
NumInitializes(initializes.size()),
2415+
NumAccesses(accesses.size()) {
2416+
std::uninitialized_copy(initializes.begin(), initializes.end(),
2417+
getTrailingObjects<Identifier>());
2418+
std::uninitialized_copy(accesses.begin(), accesses.end(),
2419+
getTrailingObjects<Identifier>() + NumInitializes);
2420+
}
2421+
2422+
StorageRestrictionsAttr *
2423+
StorageRestrictionsAttr::create(
2424+
ASTContext &ctx, SourceLoc atLoc, SourceRange range,
2425+
ArrayRef<Identifier> initializes, ArrayRef<Identifier> accesses) {
2426+
unsigned size =
2427+
totalSizeToAlloc<Identifier>(initializes.size() + accesses.size());
2428+
void *mem = ctx.Allocate(size, alignof(StorageRestrictionsAttr));
2429+
return new (mem) StorageRestrictionsAttr(atLoc, range, initializes, accesses,
2430+
/*implicit=*/false);
2431+
}
2432+
24082433
ImplementsAttr::ImplementsAttr(SourceLoc atLoc, SourceRange range,
24092434
TypeRepr *TyR,
24102435
DeclName MemberName,

lib/Parse/ParseDecl.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3424,6 +3424,10 @@ ParserStatus Parser::parseNewDeclAttribute(DeclAttributes &Attributes,
34243424
llvm_unreachable("AccessesAttr not yet implemented");
34253425
}
34263426

3427+
case DAK_StorageRestrictions: {
3428+
llvm_unreachable("StorageRestrictionsAttr not yet implemented");
3429+
}
3430+
34273431
case DAK_Implements: {
34283432
ParserResult<ImplementsAttr> Attr = parseImplementsAttribute(AtLoc, Loc);
34293433
if (Attr.isNonNull()) {

lib/Sema/TypeCheckAttr.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ class AttributeChecker : public AttributeVisitor<AttributeChecker> {
296296
void visitTypeEraserAttr(TypeEraserAttr *attr);
297297
void visitInitializesAttr(InitializesAttr *attr);
298298
void visitAccessesAttr(AccessesAttr *attr);
299+
void visitStorageRestrictionsAttr(StorageRestrictionsAttr *attr);
299300
void visitImplementsAttr(ImplementsAttr *attr);
300301
void visitNoMetadataAttr(NoMetadataAttr *attr);
301302

@@ -3589,6 +3590,9 @@ void AttributeChecker::visitAccessesAttr(AccessesAttr *attr) {
35893590
}
35903591
}
35913592

3593+
void AttributeChecker::visitStorageRestrictionsAttr(StorageRestrictionsAttr *attr) {
3594+
}
3595+
35923596
void AttributeChecker::visitImplementsAttr(ImplementsAttr *attr) {
35933597
DeclContext *DC = D->getDeclContext();
35943598

lib/Sema/TypeCheckDeclOverride.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1583,6 +1583,7 @@ namespace {
15831583
UNINTERESTING_ATTR(RestatedObjCConformance)
15841584
UNINTERESTING_ATTR(Initializes)
15851585
UNINTERESTING_ATTR(Accesses)
1586+
UNINTERESTING_ATTR(StorageRestrictions)
15861587
UNINTERESTING_ATTR(Implements)
15871588
UNINTERESTING_ATTR(StaticInitializeObjCMetadata)
15881589
UNINTERESTING_ATTR(ClangImporterSynthesizedType)

utils/gyb_syntax_support/AttributeKinds.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,11 @@ def __init__(self, name, swift_name=None):
946946
code=142),
947947
DeclAttributeAlias('freestanding', 'MacroRole'),
948948

949+
DeclAttribute('storageRestrictions', 'StorageRestrictions',
950+
OnAccessor,
951+
ABIStableToAdd, ABIStableToRemove,
952+
APIBreakingToAdd, APIBreakingToRemove,
953+
code=145),
949954
]
950955

951956
DEPRECATED_MODIFIER_KINDS = [

0 commit comments

Comments
 (0)