Skip to content

Commit a4865be

Browse files
committed
Sema: Gate SPI operator fix behind EnforceSPIOperatorGroup
This new check is source breaking. Let's gate it behind an opt-in flag for now and enable it by default on a new language mode or similar.
1 parent b248d2d commit a4865be

File tree

4 files changed

+13
-3
lines changed

4 files changed

+13
-3
lines changed

include/swift/Basic/Features.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,9 @@ EXPERIMENTAL_FEATURE(CheckImplementationOnly, true)
561561
/// report references to implementation-only imported modules.
562562
EXPERIMENTAL_FEATURE(CheckImplementationOnlyStrict, false)
563563

564+
/// Check that use sites have the required @_spi import for operators.
565+
EXPERIMENTAL_FEATURE(EnforceSPIOperatorGroup, true)
566+
564567
#undef EXPERIMENTAL_FEATURE_EXCLUDED_FROM_MODULE_INTERFACE
565568
#undef EXPERIMENTAL_FEATURE
566569
#undef UPCOMING_FEATURE

lib/AST/Decl.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5537,7 +5537,9 @@ static bool checkAccess(const DeclContext *useDC, const ValueDecl *VD,
55375537
}
55385538
case AccessLevel::Public:
55395539
case AccessLevel::Open: {
5540-
if (VD->isOperator() && VD->isSPI()) {
5540+
if (VD->getASTContext().LangOpts.hasFeature(
5541+
Feature::EnforceSPIOperatorGroup) &&
5542+
VD->isOperator() && VD->isSPI()) {
55415543
const DeclContext *useFile = useDC->getModuleScopeContext();
55425544
if (useFile->getParentModule() == sourceDC->getParentModule())
55435545
return true;

lib/AST/FeatureSet.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ UNINTERESTING_FEATURE(SameElementRequirements)
146146
UNINTERESTING_FEATURE(SendingArgsAndResults)
147147
UNINTERESTING_FEATURE(CheckImplementationOnly)
148148
UNINTERESTING_FEATURE(CheckImplementationOnlyStrict)
149+
UNINTERESTING_FEATURE(EnforceSPIOperatorGroup)
149150

150151
static bool findUnderscoredLifetimeAttr(Decl *decl) {
151152
auto hasUnderscoredLifetimeAttr = [](Decl *decl) {

test/SPI/public_client.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,21 @@
66
// RUN: %target-swift-frontend -emit-module %S/Inputs/spi_helper.swift -module-name SPIHelper -emit-module-path %t/SPIHelper.swiftmodule -emit-module-interface-path %t/SPIHelper.swiftinterface -emit-private-module-interface-path %t/SPIHelper.private.swiftinterface -enable-library-evolution -swift-version 5 -parse-as-library
77

88
/// Reading from swiftmodule
9-
// RUN: %target-typecheck-verify-swift -verify-ignore-unrelated -I %t -verify-ignore-unknown
9+
// RUN: %target-typecheck-verify-swift -verify-ignore-unrelated -I %t -verify-ignore-unknown \
10+
// RUN: -enable-experimental-feature EnforceSPIOperatorGroup
1011

1112
/// Reading from .private.swiftinterface
1213
// RUN: rm %t/SPIHelper.swiftmodule
13-
// RUN: %target-typecheck-verify-swift -verify-ignore-unrelated -I %t -verify-ignore-unknown
14+
// RUN: %target-typecheck-verify-swift -verify-ignore-unrelated -I %t -verify-ignore-unknown \
15+
// RUN: -enable-experimental-feature EnforceSPIOperatorGroup
1416

1517
/// Reading from the public .swiftinterface should raise errors on missing
1618
/// declarations.
1719
// RUN: rm %t/SPIHelper.private.swiftinterface
1820
// RUN: not %target-swift-frontend -typecheck -I %t %s
1921

22+
// REQUIRES: swift_feature_EnforceSPIOperatorGroup
23+
2024
import SPIHelper
2125

2226
// Use the public API

0 commit comments

Comments
 (0)