Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 5 additions & 16 deletions include/swift/AST/DiagnosticsSema.def
Original file line number Diff line number Diff line change
Expand Up @@ -2900,17 +2900,14 @@ ERROR(decl_from_hidden_module,none,
"in an extension with conditional conformances}2; "
"%select{%3 has been imported as implementation-only|"
"it is an SPI imported from %3|"
"it is SPI|"
"%3 was not imported by this file}4",
"it is SPI}4",
(DescriptiveDeclKind, DeclName, unsigned, Identifier, unsigned))
WARNING(decl_from_hidden_module_warn,none,
"cannot use %0 %1 %select{here|as property wrapper here|"
"as result builder here|"
"cannot use %0 %1 %select{in SPI|as property wrapper in SPI|"
"as result builder in SPI|"
"in an extension with public or '@usableFromInline' members|"
"in an extension with conditional conformances}2; "
"%select{%3 has been imported as implementation-only|"
"<<ERROR>>|<<ERROR>>|"
"%3 was not imported by this file}4",
"%select{%3 has been imported as implementation-only}4",
(DescriptiveDeclKind, DeclName, unsigned, Identifier, unsigned))
ERROR(conformance_from_implementation_only_module,none,
"cannot use conformance of %0 to %1 %select{here|as property wrapper here|"
Expand Down Expand Up @@ -5785,15 +5782,7 @@ ERROR(inlinable_decl_ref_from_hidden_module,
none, "%0 %1 cannot be used in " FRAGILE_FUNC_KIND "2 "
"because %select{%3 was imported implementation-only|"
"it is an SPI imported from %3|"
"it is SPI|"
"%3 was not imported by this file}4",
(DescriptiveDeclKind, DeclName, unsigned, Identifier, unsigned))

WARNING(inlinable_decl_ref_from_hidden_module_warn,
none, "%0 %1 cannot be used in " FRAGILE_FUNC_KIND "2 "
"because %select{<<ERROR>>|<<ERROR>>|<<ERROR>>|"
"%3 was not imported by this file}4"
"; this is an error in Swift 6",
"it is SPI}4",
(DescriptiveDeclKind, DeclName, unsigned, Identifier, unsigned))

ERROR(availability_macro_in_inlinable, none,
Expand Down
1 change: 0 additions & 1 deletion include/swift/AST/SourceFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ class PersistentParserState;
/// \sa getRestrictedImportKind
enum class RestrictedImportKind {
ImplementationOnly,
Implicit,
None // No restriction, i.e. the module is imported publicly.
};

Expand Down
10 changes: 3 additions & 7 deletions lib/AST/Module.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2442,18 +2442,14 @@ bool SourceFile::hasTestableOrPrivateImport(

RestrictedImportKind SourceFile::getRestrictedImportKind(const ModuleDecl *module) const {
auto &imports = getASTContext().getImportCache();
RestrictedImportKind importKind = RestrictedImportKind::Implicit;

// Look at the imports of this source file.
for (auto &desc : *Imports) {
// Ignore implementation-only imports.
if (desc.options.contains(ImportFlags::ImplementationOnly)) {
if (imports.isImportedBy(module, desc.module.importedModule))
importKind = RestrictedImportKind::ImplementationOnly;
if (desc.options.contains(ImportFlags::ImplementationOnly))
continue;
}

// If the module is imported publicly, it's not imported
// If the module is imported this way, it's not imported
// implementation-only.
if (imports.isImportedBy(module, desc.module.importedModule))
return RestrictedImportKind::None;
Expand All @@ -2463,7 +2459,7 @@ RestrictedImportKind SourceFile::getRestrictedImportKind(const ModuleDecl *modul
if (imports.isImportedBy(module, getParentModule()))
return RestrictedImportKind::None;

return importKind;
return RestrictedImportKind::ImplementationOnly;
}

bool ModuleDecl::isImportedImplementationOnly(const ModuleDecl *module) const {
Expand Down
11 changes: 1 addition & 10 deletions lib/Sema/ResilienceDiagnostics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,16 +146,7 @@ TypeChecker::diagnoseDeclRefExportability(SourceLoc loc,

D->diagnose(diag::kind_declared_here, DescriptiveDeclKind::Type);
} else {
// Only implicitly imported decls should be reported as a warning,
// and only for language versions below Swift 6.
assert(downgradeToWarning == DowngradeToWarning::No ||
originKind == DisallowedOriginKind::ImplicitlyImported &&
"Only implicitly imported decls should be reported as a warning.");
auto errorOrWarning = downgradeToWarning == DowngradeToWarning::Yes?
diag::inlinable_decl_ref_from_hidden_module_warn:
diag::inlinable_decl_ref_from_hidden_module;

ctx.Diags.diagnose(loc, errorOrWarning,
ctx.Diags.diagnose(loc, diag::inlinable_decl_ref_from_hidden_module,
D->getDescriptiveKind(), D->getName(),
fragileKind.getSelector(), definingModule->getName(),
static_cast<unsigned>(originKind));
Expand Down
19 changes: 2 additions & 17 deletions lib/Sema/TypeCheckAccess.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1511,15 +1511,6 @@ swift::getDisallowedOriginKind(const Decl *decl,
if (where.isSPI())
downgradeToWarning = DowngradeToWarning::Yes;

// Before Swift 6, implicit imports were not reported unless an
// implementation-only import was also present. Downgrade to a warning
// just in this case.
if (howImported == RestrictedImportKind::Implicit &&
!SF->getASTContext().isSwiftVersionAtLeast(6) &&
!SF->hasImplementationOnlyImports()) {
downgradeToWarning = DowngradeToWarning::Yes;
}

// Even if the current module is @_implementationOnly, Swift should
// not report an error in the cases where the decl is also exported from
// a non @_implementationOnly module. Thus, we check to see if there is
Expand All @@ -1540,12 +1531,9 @@ swift::getDisallowedOriginKind(const Decl *decl,
continue;
}
}
auto owningModule = redecl->getOwningModule();
if (!owningModule)
continue;
auto moduleWrapper =
decl->getASTContext().getClangModuleLoader()->getWrapperForModule(
owningModule);
redecl->getOwningModule());
auto visibleAccessPath =
find_if(sfImportedModules, [&moduleWrapper](auto importedModule) {
return importedModule.importedModule == moduleWrapper ||
Expand All @@ -1557,10 +1545,7 @@ swift::getDisallowedOriginKind(const Decl *decl,
}
}
}

// Restrictively imported, cannot be reexported.
if (howImported == RestrictedImportKind::Implicit)
return DisallowedOriginKind::ImplicitlyImported;
// Implementation-only imported, cannot be reexported.
return DisallowedOriginKind::ImplementationOnly;
} else if ((decl->isSPI() || decl->isAvailableAsSPI()) && !where.isSPI()) {
if (decl->isAvailableAsSPI() && !decl->isSPI()) {
Expand Down
2 changes: 0 additions & 2 deletions lib/Sema/TypeCheckAccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,12 @@ void checkAccessControl(Decl *D);
// Problematic origin of an exported type.
//
// This enum must be kept in sync with
// diag::inlinable_decl_ref_from_hidden_module,
// diag::decl_from_hidden_module and
// diag::conformance_from_implementation_only_module.
enum class DisallowedOriginKind : uint8_t {
ImplementationOnly,
SPIImported,
SPILocal,
ImplicitlyImported,
None
};

Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/Cxx/std/std.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,5 @@

@_exported import std // Clang module
@_exported import Cxx // Swift module

public var dummy: Int = 1
8 changes: 4 additions & 4 deletions test/SPI/implementation_only_spi_import_exposability.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ public protocol IOIProtocol {}

@_spi(A) @_implementationOnly import Lib

@_spi(B) public func leakSPIStruct(_ a: SPIStruct) -> SPIStruct { fatalError() } // expected-warning 2 {{cannot use struct 'SPIStruct' here; 'Lib' has been imported as implementation-only}}
@_spi(B) public func leakIOIStruct(_ a: IOIStruct) -> IOIStruct { fatalError() } // expected-warning 2 {{cannot use struct 'IOIStruct' here; 'Lib' has been imported as implementation-only}}
@_spi(B) public func leakSPIStruct(_ a: SPIStruct) -> SPIStruct { fatalError() } // expected-warning 2 {{cannot use struct 'SPIStruct' in SPI; 'Lib' has been imported as implementation-only}}
@_spi(B) public func leakIOIStruct(_ a: IOIStruct) -> IOIStruct { fatalError() } // expected-warning 2 {{cannot use struct 'IOIStruct' in SPI; 'Lib' has been imported as implementation-only}}

public struct PublicStruct : IOIProtocol, SPIProtocol { // expected-error {{cannot use protocol 'IOIProtocol' here; 'Lib' has been imported as implementation-only}}
// expected-error @-1 {{cannot use protocol 'SPIProtocol' here; 'Lib' has been imported as implementation-only}}
Expand All @@ -46,8 +46,8 @@ public struct PublicStruct : IOIProtocol, SPIProtocol { // expected-error {{cann
}

@_spi(B)
public struct LocalSPIStruct : IOIProtocol, SPIProtocol { // expected-warning {{cannot use protocol 'IOIProtocol' here; 'Lib' has been imported as implementation-only}}
// expected-warning @-1 {{cannot use protocol 'SPIProtocol' here; 'Lib' has been imported as implementation-only}}
public struct LocalSPIStruct : IOIProtocol, SPIProtocol { // expected-warning {{cannot use protocol 'IOIProtocol' in SPI; 'Lib' has been imported as implementation-only}}
// expected-warning @-1 {{cannot use protocol 'SPIProtocol' in SPI; 'Lib' has been imported as implementation-only}}
}

#endif
76 changes: 0 additions & 76 deletions test/Sema/implicit-import-in-inlinable-code.swift

This file was deleted.