@@ -898,12 +898,20 @@ bool DeclAttribute::printImpl(ASTPrinter &Printer, const PrintOptions &Options,
898898 }
899899
900900 case DAK_Specialize: {
901- Printer << " @" << getAttrName () << " (" ;
902901 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 () << " (" ;
903908 auto exported = attr->isExported () ? " true" : " false" ;
904909 auto kind = attr->isPartialSpecialization () ? " partial" : " full" ;
905910 auto target = attr->getTargetFunctionName ();
906911 Printer << " exported: " << exported << " , " ;
912+ for (auto id : attr->getSPIGroups ()) {
913+ Printer << " spi: " << id << " , " ;
914+ }
907915 Printer << " kind: " << kind << " , " ;
908916 if (target)
909917 Printer << " target: " << target << " , " ;
@@ -1558,16 +1566,17 @@ const AvailableAttr *AvailableAttr::isUnavailable(const Decl *D) {
15581566}
15591567
15601568SpecializeAttr::SpecializeAttr (SourceLoc atLoc, SourceRange range,
1561- TrailingWhereClause *clause,
1562- bool exported,
1569+ TrailingWhereClause *clause, bool exported,
15631570 SpecializationKind kind,
15641571 GenericSignature specializedSignature,
1565- DeclNameRef targetFunctionName)
1572+ DeclNameRef targetFunctionName,
1573+ ArrayRef<Identifier> spiGroups)
15661574 : DeclAttribute(DAK_Specialize, atLoc, range,
15671575 /* 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>());
15711580 Bits.SpecializeAttr .exported = exported;
15721581 Bits.SpecializeAttr .kind = unsigned (kind);
15731582}
@@ -1579,32 +1588,38 @@ TrailingWhereClause *SpecializeAttr::getTrailingWhereClause() const {
15791588SpecializeAttr *SpecializeAttr::create (ASTContext &Ctx, SourceLoc atLoc,
15801589 SourceRange range,
15811590 TrailingWhereClause *clause,
1582- bool exported,
1583- SpecializationKind kind,
1591+ bool exported, SpecializationKind kind,
15841592 DeclNameRef targetFunctionName,
1593+ ArrayRef<Identifier> spiGroups,
15851594 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);
15881600}
15891601
15901602SpecializeAttr *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)
15951610 SpecializeAttr (SourceLoc (), SourceRange (), nullptr , exported, kind,
1596- specializedSignature, targetFunctionName);
1611+ specializedSignature, targetFunctionName, spiGroups );
15971612}
15981613
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 )
16061621 SpecializeAttr (SourceLoc (), SourceRange (), nullptr , exported, kind,
1607- specializedSignature, targetFunctionName);
1622+ specializedSignature, targetFunctionName, spiGroups );
16081623 attr->resolver = resolver;
16091624 attr->resolverContextData = data;
16101625 return attr;
0 commit comments