@@ -898,12 +898,20 @@ bool DeclAttribute::printImpl(ASTPrinter &Printer, const PrintOptions &Options,
898
898
}
899
899
900
900
case DAK_Specialize: {
901
- Printer << " @" << getAttrName () << " (" ;
902
901
auto *attr = cast<SpecializeAttr>(this );
902
+ // Don't print the _specialize attribute if it is marked spi and we are
903
+ // asked to skip SPI.
904
+ if (!Options.PrintSPIs && !attr->getSPIGroups ().empty ())
905
+ return false ;
906
+
907
+ Printer << " @" << getAttrName () << " (" ;
903
908
auto exported = attr->isExported () ? " true" : " false" ;
904
909
auto kind = attr->isPartialSpecialization () ? " partial" : " full" ;
905
910
auto target = attr->getTargetFunctionName ();
906
911
Printer << " exported: " << exported << " , " ;
912
+ for (auto id : attr->getSPIGroups ()) {
913
+ Printer << " spi: " << id << " , " ;
914
+ }
907
915
Printer << " kind: " << kind << " , " ;
908
916
if (target)
909
917
Printer << " target: " << target << " , " ;
@@ -1558,16 +1566,17 @@ const AvailableAttr *AvailableAttr::isUnavailable(const Decl *D) {
1558
1566
}
1559
1567
1560
1568
SpecializeAttr::SpecializeAttr (SourceLoc atLoc, SourceRange range,
1561
- TrailingWhereClause *clause,
1562
- bool exported,
1569
+ TrailingWhereClause *clause, bool exported,
1563
1570
SpecializationKind kind,
1564
1571
GenericSignature specializedSignature,
1565
- DeclNameRef targetFunctionName)
1572
+ DeclNameRef targetFunctionName,
1573
+ ArrayRef<Identifier> spiGroups)
1566
1574
: DeclAttribute(DAK_Specialize, atLoc, range,
1567
1575
/* Implicit=*/ clause == nullptr ),
1568
- trailingWhereClause(clause),
1569
- specializedSignature(specializedSignature),
1570
- targetFunctionName(targetFunctionName) {
1576
+ trailingWhereClause(clause), specializedSignature(specializedSignature),
1577
+ targetFunctionName(targetFunctionName), numSPIGroups(spiGroups.size()) {
1578
+ std::uninitialized_copy (spiGroups.begin (), spiGroups.end (),
1579
+ getTrailingObjects<Identifier>());
1571
1580
Bits.SpecializeAttr .exported = exported;
1572
1581
Bits.SpecializeAttr .kind = unsigned (kind);
1573
1582
}
@@ -1579,32 +1588,38 @@ TrailingWhereClause *SpecializeAttr::getTrailingWhereClause() const {
1579
1588
SpecializeAttr *SpecializeAttr::create (ASTContext &Ctx, SourceLoc atLoc,
1580
1589
SourceRange range,
1581
1590
TrailingWhereClause *clause,
1582
- bool exported,
1583
- SpecializationKind kind,
1591
+ bool exported, SpecializationKind kind,
1584
1592
DeclNameRef targetFunctionName,
1593
+ ArrayRef<Identifier> spiGroups,
1585
1594
GenericSignature specializedSignature) {
1586
- return new (Ctx) SpecializeAttr (atLoc, range, clause, exported, kind,
1587
- specializedSignature, targetFunctionName);
1595
+ unsigned size = totalSizeToAlloc<Identifier>(spiGroups.size ());
1596
+ void *mem = Ctx.Allocate (size, alignof (SpecializeAttr));
1597
+ return new (mem)
1598
+ SpecializeAttr (atLoc, range, clause, exported, kind, specializedSignature,
1599
+ targetFunctionName, spiGroups);
1588
1600
}
1589
1601
1590
1602
SpecializeAttr *SpecializeAttr::create (ASTContext &ctx, bool exported,
1591
- SpecializationKind kind,
1592
- GenericSignature specializedSignature,
1593
- DeclNameRef targetFunctionName) {
1594
- return new (ctx)
1603
+ SpecializationKind kind,
1604
+ ArrayRef<Identifier> spiGroups,
1605
+ GenericSignature specializedSignature,
1606
+ DeclNameRef targetFunctionName) {
1607
+ unsigned size = totalSizeToAlloc<Identifier>(spiGroups.size ());
1608
+ void *mem = ctx.Allocate (size, alignof (SpecializeAttr));
1609
+ return new (mem)
1595
1610
SpecializeAttr (SourceLoc (), SourceRange (), nullptr , exported, kind,
1596
- specializedSignature, targetFunctionName);
1611
+ specializedSignature, targetFunctionName, spiGroups );
1597
1612
}
1598
1613
1599
- SpecializeAttr *SpecializeAttr::create (ASTContext &ctx, bool exported,
1600
- SpecializationKind kind,
1601
- GenericSignature specializedSignature,
1602
- DeclNameRef targetFunctionName,
1603
- LazyMemberLoader *resolver,
1604
- uint64_t data) {
1605
- auto *attr = new (ctx )
1614
+ SpecializeAttr *SpecializeAttr::create (
1615
+ ASTContext &ctx, bool exported, SpecializationKind kind,
1616
+ ArrayRef<Identifier> spiGroups, GenericSignature specializedSignature,
1617
+ DeclNameRef targetFunctionName, LazyMemberLoader *resolver, uint64_t data) {
1618
+ unsigned size = totalSizeToAlloc<Identifier>(spiGroups. size ());
1619
+ void *mem = ctx. Allocate (size, alignof (SpecializeAttr));
1620
+ auto *attr = new (mem )
1606
1621
SpecializeAttr (SourceLoc (), SourceRange (), nullptr , exported, kind,
1607
- specializedSignature, targetFunctionName);
1622
+ specializedSignature, targetFunctionName, spiGroups );
1608
1623
attr->resolver = resolver;
1609
1624
attr->resolverContextData = data;
1610
1625
return attr;
0 commit comments