Skip to content

Commit 64939d1

Browse files
authored
Merge pull request swiftlang#35602 from xymus/spi-indirect-conformance
[ModuleInterface] Preserve SPI information for indirect conformances
2 parents fdbe872 + c76269e commit 64939d1

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

lib/Frontend/ModuleInterfaceSupport.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,9 @@ class InheritedProtocolCollector {
452452
inherited->isSpecificProtocol(KnownProtocolKind::Actor))
453453
return TypeWalker::Action::Continue;
454454

455+
if (inherited->isSPI() && !printOptions.PrintSPIs)
456+
return TypeWalker::Action::Continue;
457+
455458
if (isPublicOrUsableFromInline(inherited) &&
456459
conformanceDeclaredInModule(M, nominal, inherited)) {
457460
protocolsToPrint.push_back({inherited, protoAndAvailability.second});
@@ -466,17 +469,20 @@ class InheritedProtocolCollector {
466469

467470
for (const auto &protoAndAvailability : protocolsToPrint) {
468471
StreamPrinter printer(out);
472+
ProtocolDecl *proto = protoAndAvailability.first;
473+
469474
// FIXME: Shouldn't this be an implicit conversion?
470475
TinyPtrVector<const DeclAttribute *> attrs;
471476
attrs.insert(attrs.end(), protoAndAvailability.second.begin(),
472477
protoAndAvailability.second.end());
478+
auto spiAttributes = proto->getAttrs().getAttributes<SPIAccessControlAttr>();
479+
attrs.insert(attrs.end(), spiAttributes.begin(), spiAttributes.end());
473480
DeclAttributes::print(printer, printOptions, attrs);
474481

475482
printer << "extension ";
476483
nominal->getDeclaredType().print(printer, printOptions);
477484
printer << " : ";
478485

479-
ProtocolDecl *proto = protoAndAvailability.first;
480486
proto->getDeclaredInterfaceType()->print(printer, printOptions);
481487

482488
printer << " {}\n";

test/SPI/private_swiftinterface.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,3 +200,11 @@ extension IOIPublicStruct : LocalPublicProto {}
200200
extension PublicType: SPIProto where T: PrivateConstraint {}
201201
// CHECK-PRIVATE: extension {{.*}}.PublicType : {{.*}}.SPIProto where T : _ConstraintThatIsNotPartOfTheAPIOfThisLibrary
202202
// CHECK-PUBLIC-NOT: _ConstraintThatIsNotPartOfTheAPIOfThisLibrary
203+
204+
// Preserve SPI information when printing indirect conformances via
205+
// an internal protocol. rdar://73082943
206+
@_spi(S) public protocol SPIProtocol {}
207+
internal protocol InternalProtocol: SPIProtocol {}
208+
public struct PublicStruct2: InternalProtocol {}
209+
// CHECK-PRIVATE: @_spi(S) extension {{.*}}.PublicStruct2 : {{.*}}.SPIProtocol
210+
// CHECK-PUBLIC-NOT: SPIProtocol

0 commit comments

Comments
 (0)