diff --git a/include/swift/AST/DiagnosticsFrontend.def b/include/swift/AST/DiagnosticsFrontend.def index cb484dd3b432e..01125333b40e1 100644 --- a/include/swift/AST/DiagnosticsFrontend.def +++ b/include/swift/AST/DiagnosticsFrontend.def @@ -44,6 +44,11 @@ ERROR(error_unknown_library_level, none, "unknown library level '%0', " "expected one of 'api', 'spi', 'ipi', or 'other'", (StringRef)) +ERROR(error_old_spi_only_import_unsupported, none, + "'-experimental-spi-imports' is unsupported in Swift 6, " + "use '@_spiOnly' instead", + ()) + ERROR(error_unknown_require_explicit_availability, none, "unknown argument '%0', passed to -require-explicit-availability, " "expected 'error', 'warn' or 'ignore'", diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 84da16c5db6f8..ba637bc51dcd5 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -3337,6 +3337,17 @@ bool CompilerInvocation::parseArgs( } } + // With Swift 6, enable @_spiOnly by default and forbid the old version. + // This also enables proper error reporting of ioi references from spi decls. + if (LangOpts.EffectiveLanguageVersion.isVersionAtLeast(6)) { + LangOpts.EnableSPIOnlyImports = true; + + if (ParsedArgs.hasArg(OPT_experimental_spi_imports)) { + Diags.diagnose(SourceLoc(), diag::error_old_spi_only_import_unsupported); + return true; + } + } + return false; } diff --git a/test/ModuleInterface/access-level-import-swiftinterfaces.swift b/test/ModuleInterface/access-level-import-swiftinterfaces.swift index 5ef72ea8d2e14..f600e3e4bfac4 100644 --- a/test/ModuleInterface/access-level-import-swiftinterfaces.swift +++ b/test/ModuleInterface/access-level-import-swiftinterfaces.swift @@ -108,7 +108,7 @@ /// Build a client with multiple files. // RUN: %target-swift-frontend -typecheck %t/MultiFiles?.swift -I %t \ // RUN: -package-name TestPackage -module-name MultiFiles_Swift6 \ -// RUN: -experimental-spi-only-imports -experimental-spi-imports \ +// RUN: -experimental-spi-only-imports \ // RUN: -enable-library-evolution -swift-version 6 \ // RUN: -emit-module-interface-path %t/MultiFiles_Swift6.swiftinterface \ // RUN: -emit-private-module-interface-path %t/MultiFiles_Swift6.private.swiftinterface \ diff --git a/test/SPI/experimental_spi_imports_swiftinterface.swift b/test/SPI/experimental_spi_imports_swiftinterface.swift index 908721f25ed92..48fa16a43527e 100644 --- a/test/SPI/experimental_spi_imports_swiftinterface.swift +++ b/test/SPI/experimental_spi_imports_swiftinterface.swift @@ -16,6 +16,11 @@ // RUN: %FileCheck -check-prefix=CHECK-PUBLIC %s < %t/main.swiftinterface // RUN: %FileCheck -check-prefix=CHECK-PRIVATE %s < %t/main.private.swiftinterface +/// The flag is rejected in Swift 6. +// RUN: not %target-swift-frontend -typecheck % -swift-version 6 \ +// RUN: -experimental-spi-imports 2>&1 | %FileCheck %s -check-prefix=CHECK-6 +// CHECK-6: error: '-experimental-spi-imports' is unsupported in Swift 6, use '@_spiOnly' instead + @_spi(dummy) @_implementationOnly import ExperimentalImported // CHECK-PUBLIC-NOT: import ExperimentalImported // CHECK-PRIVATE: @_implementationOnly @_spi{{.*}} import ExperimentalImported diff --git a/test/SPI/spi_only_import_flag_check.swift b/test/SPI/spi_only_import_flag_check.swift index 87dffc6bfd50e..81f9a8df24a31 100644 --- a/test/SPI/spi_only_import_flag_check.swift +++ b/test/SPI/spi_only_import_flag_check.swift @@ -16,6 +16,11 @@ // RUN: -module-name Client -emit-module-path %t/Client.swiftmodule \ // RUN: -experimental-spi-only-imports +/// Attribute is accepted without the flag in Swift 6. +// RUN: %target-swift-frontend -emit-module %t/Client.swift -I %t \ +// RUN: -module-name Client -emit-module-path %t/Client.swiftmodule \ +// RUN: -swift-version 6 + /// Attribute is accepted without the flag when in a swiftinterface. // RUN: %target-swift-typecheck-module-from-interface(%t/Client.private.swiftinterface) \ // RUN: -I %t -module-name Client