Skip to content

Commit 2322164

Browse files
committed
[Sema] Report typealiases desugaring to a non-public import in API
Typealiases with an underlying type from a non-public import cannot be used in API or inlinable code. Report this as an error.
1 parent 411ad87 commit 2322164

File tree

3 files changed

+40
-6
lines changed

3 files changed

+40
-6
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3450,7 +3450,8 @@ ERROR(typealias_desugars_to_type_from_hidden_module,none,
34503450
"<<ERROR>>|"
34513451
"%4 was imported for SPI only|"
34523452
"%4 was not imported by this file|"
3453-
"C++ types from imported module %4 do not support library evolution}5",
3453+
"C++ types from imported module %4 do not support library evolution|"
3454+
"%4 was not imported publicly}5",
34543455
(const TypeAliasDecl *, StringRef, StringRef, unsigned, Identifier, unsigned))
34553456
ERROR(conformance_from_implementation_only_module,none,
34563457
"cannot use conformance of %0 to %1 %select{here|as property wrapper here|"
@@ -6586,7 +6587,8 @@ ERROR(inlinable_typealias_desugars_to_type_from_hidden_module,
65866587
"<<ERROR>>|"
65876588
"%4 was imported for SPI only|"
65886589
"%4 was not imported by this file|"
6589-
"C++ types from imported module %4 do not support library evolution}5",
6590+
"C++ types from imported module %4 do not support library evolution|"
6591+
"%4 was not imported publicly}5",
65906592
(const TypeAliasDecl *, StringRef, StringRef, unsigned, Identifier, unsigned))
65916593

65926594
NOTE(missing_import_inserted,

lib/Sema/ResilienceDiagnostics.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,24 +152,24 @@ static bool diagnoseTypeAliasDeclRefExportability(SourceLoc loc,
152152

153153
auto definingModule = D->getModuleContext();
154154
auto fragileKind = where.getFragileFunctionKind();
155+
bool warnPreSwift6 = originKind != DisallowedOriginKind::SPIOnly &&
156+
originKind != DisallowedOriginKind::NonPublicImport;
155157
if (fragileKind.kind == FragileFunctionKind::None) {
156158
auto reason = where.getExportabilityReason();
157159
ctx.Diags
158160
.diagnose(loc, diag::typealias_desugars_to_type_from_hidden_module,
159161
TAD, definingModule->getNameStr(), D->getNameStr(),
160162
static_cast<unsigned>(*reason), definingModule->getName(),
161163
static_cast<unsigned>(originKind))
162-
.warnUntilSwiftVersionIf(originKind != DisallowedOriginKind::SPIOnly,
163-
6);
164+
.warnUntilSwiftVersionIf(warnPreSwift6, 6);
164165
} else {
165166
ctx.Diags
166167
.diagnose(loc,
167168
diag::inlinable_typealias_desugars_to_type_from_hidden_module,
168169
TAD, definingModule->getNameStr(), D->getNameStr(),
169170
fragileKind.getSelector(), definingModule->getName(),
170171
static_cast<unsigned>(originKind))
171-
.warnUntilSwiftVersionIf(originKind != DisallowedOriginKind::SPIOnly,
172-
6);
172+
.warnUntilSwiftVersionIf(warnPreSwift6, 6);
173173
}
174174
D->diagnose(diag::kind_declared_here, DescriptiveDeclKind::Type);
175175

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: split-file %s %t
3+
4+
// RUN: %target-swift-emit-module-interface(%t/Original.swiftinterface) %t/Original.swift
5+
// RUN: %target-swift-typecheck-module-from-interface(%t/Original.swiftinterface)
6+
7+
// RUN: %target-swift-emit-module-interface(%t/Aliases.swiftinterface) %t/Aliases.swift -I %t
8+
// RUN: %target-swift-typecheck-module-from-interface(%t/Aliases.swiftinterface) -I %t
9+
10+
// RUN: %target-swift-frontend -typecheck -verify %t/UsesAliasesNoImport.swift -I %t \
11+
// RUN: -swift-version 5 -enable-library-evolution \
12+
// RUN: -enable-experimental-feature AccessLevelOnImport
13+
14+
//--- Original.swift
15+
open class Clazz {}
16+
17+
//--- Aliases.swift
18+
import Original
19+
public typealias ClazzAlias = Clazz
20+
21+
//--- UsesAliasesNoImport.swift
22+
public import Aliases
23+
internal import Original
24+
25+
// expected-error@+1 {{'ClazzAlias' aliases 'Original.Clazz' and cannot be used here because 'Original' was not imported publicly}}
26+
public class InheritsFromClazzAlias: ClazzAlias {}
27+
28+
@inlinable public func inlinableFunc() {
29+
// expected-error@+1 {{'ClazzAlias' aliases 'Original.Clazz' and cannot be used in an '@inlinable' function because 'Original' was not imported publicly}}
30+
_ = ClazzAlias.self
31+
}
32+

0 commit comments

Comments
 (0)