Skip to content

Commit a192f78

Browse files
Merge pull request #39596 from aschwaighofer/available_argument_for_at_specialize
Add support for `availability` to `@_specialize`
2 parents ca0dff8 + cd7283d commit a192f78

35 files changed

+679
-310
lines changed

include/swift/AST/Attr.h

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,7 +1302,8 @@ class SynthesizedProtocolAttr : public DeclAttribute {
13021302
/// type list.
13031303
class SpecializeAttr final
13041304
: public DeclAttribute,
1305-
private llvm::TrailingObjects<SpecializeAttr, Identifier> {
1305+
private llvm::TrailingObjects<SpecializeAttr, Identifier,
1306+
AvailableAttr *> {
13061307
friend class SpecializeAttrTargetDeclRequest;
13071308
friend TrailingObjects;
13081309

@@ -1321,35 +1322,44 @@ class SpecializeAttr final
13211322
LazyMemberLoader *resolver = nullptr;
13221323
uint64_t resolverContextData;
13231324
size_t numSPIGroups;
1325+
size_t numAvailableAttrs;
13241326

13251327
SpecializeAttr(SourceLoc atLoc, SourceRange Range,
13261328
TrailingWhereClause *clause, bool exported,
13271329
SpecializationKind kind, GenericSignature specializedSignature,
1328-
DeclNameRef targetFunctionName,
1329-
ArrayRef<Identifier> spiGroups);
1330+
DeclNameRef targetFunctionName, ArrayRef<Identifier> spiGroups,
1331+
ArrayRef<AvailableAttr *> availabilityAttrs);
13301332

13311333
public:
1332-
static SpecializeAttr *create(ASTContext &Ctx, SourceLoc atLoc,
1333-
SourceRange Range, TrailingWhereClause *clause,
1334-
bool exported, SpecializationKind kind,
1335-
DeclNameRef targetFunctionName,
1336-
ArrayRef<Identifier> spiGroups,
1337-
GenericSignature specializedSignature
1338-
= nullptr);
1334+
static SpecializeAttr *
1335+
create(ASTContext &Ctx, SourceLoc atLoc, SourceRange Range,
1336+
TrailingWhereClause *clause, bool exported, SpecializationKind kind,
1337+
DeclNameRef targetFunctionName, ArrayRef<Identifier> spiGroups,
1338+
ArrayRef<AvailableAttr *> availabilityAttrs,
1339+
GenericSignature specializedSignature = nullptr);
13391340

13401341
static SpecializeAttr *create(ASTContext &ctx, bool exported,
13411342
SpecializationKind kind,
13421343
ArrayRef<Identifier> spiGroups,
1344+
ArrayRef<AvailableAttr *> availabilityAttrs,
13431345
GenericSignature specializedSignature,
13441346
DeclNameRef replacedFunction);
13451347

13461348
static SpecializeAttr *create(ASTContext &ctx, bool exported,
13471349
SpecializationKind kind,
13481350
ArrayRef<Identifier> spiGroups,
1351+
ArrayRef<AvailableAttr *> availabilityAttrs,
13491352
GenericSignature specializedSignature,
13501353
DeclNameRef replacedFunction,
13511354
LazyMemberLoader *resolver, uint64_t data);
13521355

1356+
size_t numTrailingObjects(OverloadToken<Identifier>) const {
1357+
return numSPIGroups;
1358+
}
1359+
1360+
size_t numTrailingObjects(OverloadToken<AvailableAttr *>) const {
1361+
return numAvailableAttrs;
1362+
}
13531363
/// Name of SPIs declared by the attribute.
13541364
///
13551365
/// Note: A single SPI name per attribute is currently supported but this
@@ -1359,6 +1369,11 @@ class SpecializeAttr final
13591369
numSPIGroups };
13601370
}
13611371

1372+
ArrayRef<AvailableAttr *> getAvailabeAttrs() const {
1373+
return {this->template getTrailingObjects<AvailableAttr *>(),
1374+
numAvailableAttrs};
1375+
}
1376+
13621377
TrailingWhereClause *getTrailingWhereClause() const;
13631378

13641379
GenericSignature getSpecializedSignature() const {

include/swift/AST/Availability.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,9 @@ class AvailabilityInference {
316316
static Optional<AvailabilityContext> annotatedAvailableRange(const Decl *D,
317317
ASTContext &C);
318318

319+
static AvailabilityContext
320+
annotatedAvailableRangeForAttr(const SpecializeAttr* attr, ASTContext &ctx);
321+
319322
};
320323

321324
} // end namespace swift

include/swift/AST/DiagnosticsParse.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,6 +1399,9 @@ ERROR(attr_expected_lparen,none,
13991399
ERROR(attr_expected_rparen,none,
14001400
"expected ')' in '%0' %select{attribute|modifier}1", (StringRef, bool))
14011401

1402+
ERROR(attr_expected_semi,none,
1403+
"expected ';' in '%0' %select{attribute|modifier}1", (StringRef, bool))
1404+
14021405
ERROR(attr_expected_comma,none,
14031406
"expected ',' in '%0' %select{attribute|modifier}1", (StringRef, bool))
14041407

include/swift/Parse/Parser.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,7 +1049,7 @@ class Parser {
10491049
/// \p Attr is where to store the parsed attribute
10501050
bool parseSpecializeAttribute(
10511051
swift::tok ClosingBrace, SourceLoc AtLoc, SourceLoc Loc,
1052-
SpecializeAttr *&Attr,
1052+
SpecializeAttr *&Attr, AvailabilityContext *SILAvailability,
10531053
llvm::function_ref<bool(Parser &)> parseSILTargetName =
10541054
[](Parser &) { return false; },
10551055
llvm::function_ref<bool(Parser &)> parseSILSIPModule =
@@ -1060,7 +1060,9 @@ class Parser {
10601060
swift::tok ClosingBrace, bool &DiscardAttribute, Optional<bool> &Exported,
10611061
Optional<SpecializeAttr::SpecializationKind> &Kind,
10621062
TrailingWhereClause *&TrailingWhereClause, DeclNameRef &targetFunction,
1063+
AvailabilityContext *SILAvailability,
10631064
SmallVectorImpl<Identifier> &spiGroups,
1065+
SmallVectorImpl<AvailableAttr *> &availableAttrs,
10641066
llvm::function_ref<bool(Parser &)> parseSILTargetName,
10651067
llvm::function_ref<bool(Parser &)> parseSILSIPModule);
10661068

@@ -1850,7 +1852,11 @@ class Parser {
18501852
parsePlatformVersionConstraintSpec();
18511853
ParserResult<PlatformAgnosticVersionConstraintAvailabilitySpec>
18521854
parsePlatformAgnosticVersionConstraintSpec();
1853-
1855+
bool
1856+
parseAvailability(bool parseAsPartOfSpecializeAttr, StringRef AttrName,
1857+
bool &DiscardAttribute, SourceRange &attrRange,
1858+
SourceLoc AtLoc, SourceLoc Loc,
1859+
llvm::function_ref<void(AvailableAttr *)> addAttribute);
18541860
//===--------------------------------------------------------------------===//
18551861
// Code completion second pass.
18561862

include/swift/SIL/SILFunction.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ class SILSpecializeAttr final {
7272
GenericSignature specializedSignature,
7373
bool exported, SpecializationKind kind,
7474
SILFunction *target, Identifier spiGroup,
75-
const ModuleDecl *spiModule);
75+
const ModuleDecl *spiModule,
76+
AvailabilityContext availability);
7677

7778
bool isExported() const {
7879
return exported;
@@ -110,20 +111,26 @@ class SILSpecializeAttr final {
110111
return spiModule;
111112
}
112113

114+
AvailabilityContext getAvailability() const {
115+
return availability;
116+
}
117+
113118
void print(llvm::raw_ostream &OS) const;
114119

115120
private:
116121
SpecializationKind kind;
117122
bool exported;
118123
GenericSignature specializedSignature;
119124
Identifier spiGroup;
125+
AvailabilityContext availability;
120126
const ModuleDecl *spiModule = nullptr;
121127
SILFunction *F = nullptr;
122128
SILFunction *targetFunction = nullptr;
123129

124130
SILSpecializeAttr(bool exported, SpecializationKind kind,
125131
GenericSignature specializedSignature, SILFunction *target,
126-
Identifier spiGroup, const ModuleDecl *spiModule);
132+
Identifier spiGroup, const ModuleDecl *spiModule,
133+
AvailabilityContext availability);
127134
};
128135

129136
/// SILFunction - A function body that has been lowered to SIL. This consists of

0 commit comments

Comments
 (0)