Skip to content

Commit 31e8933

Browse files
authored
Merge pull request #39527 from xymus/error-on-public-import-of-private
2 parents 9875bcf + 315181d commit 31e8933

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2912,7 +2912,7 @@ WARNING(warn_implementation_only_conflict,none,
29122912
(Identifier))
29132913
NOTE(implementation_only_conflict_here,none,
29142914
"imported as implementation-only here", ())
2915-
WARNING(warn_public_import_of_private_module,none,
2915+
ERROR(error_public_import_of_private_module,none,
29162916
"private module %0 is imported publicly from the public module %1",
29172917
(Identifier, Identifier))
29182918

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1709,12 +1709,16 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
17091709

17101710
auto &diags = ID->getASTContext().Diags;
17111711
InFlightDiagnostic inFlight =
1712-
diags.diagnose(ID, diag::warn_public_import_of_private_module,
1712+
diags.diagnose(ID, diag::error_public_import_of_private_module,
17131713
target->getName(), importer->getName());
17141714
if (ID->getAttrs().isEmpty()) {
17151715
inFlight.fixItInsert(ID->getStartLoc(),
17161716
"@_implementationOnly ");
17171717
}
1718+
1719+
static bool treatAsError = getenv("ENABLE_PUBLIC_IMPORT_OF_PRIVATE_AS_ERROR");
1720+
if (!treatAsError)
1721+
inFlight.limitBehavior(DiagnosticBehavior::Warning);
17181722
}
17191723
}
17201724
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/// Same test as implementation-only-import-suggestion upgrading warnings to
2+
/// errors. We can remove this test when this becomes the default behavior.
3+
4+
// RUN: %empty-directory(%t)
5+
// REQUIRES: VENDOR=apple
6+
7+
/// Prepare the SDK.
8+
// RUN: cp -r %S/Inputs/public-private-sdk %t/sdk
9+
// RUN: %target-swift-frontend -emit-module -module-name PublicSwift \
10+
// RUN: %t/sdk/System/Library/Frameworks/PublicSwift.framework/Modules/PublicSwift.swiftmodule/source.swift \
11+
// RUN: -o %t/sdk/System/Library/Frameworks/PublicSwift.framework/Modules/PublicSwift.swiftmodule/%target-swiftmodule-name
12+
// RUN: %target-swift-frontend -emit-module -module-name PrivateSwift \
13+
// RUN: %t/sdk/System/Library/PrivateFrameworks/PrivateSwift.framework/Modules/PrivateSwift.swiftmodule/source.swift \
14+
// RUN: -o %t/sdk/System/Library/PrivateFrameworks/PrivateSwift.framework/Modules/PrivateSwift.swiftmodule/%target-swiftmodule-name
15+
16+
/// Expect errors when building a public client.
17+
// RUN: env ENABLE_PUBLIC_IMPORT_OF_PRIVATE_AS_ERROR=1 \
18+
// RUN: %target-swift-frontend -typecheck -sdk %t/sdk -module-cache-path %t %s \
19+
// RUN: -F %t/sdk/System/Library/PrivateFrameworks/ \
20+
// RUN: -library-level api -verify
21+
22+
import PublicSwift
23+
import PrivateSwift // expected-error{{private module 'PrivateSwift' is imported publicly from the public module 'main'}}
24+
25+
import PublicClang
26+
import PublicClang_Private // expected-error{{private module 'PublicClang_Private' is imported publicly from the public module 'main'}}
27+
import FullyPrivateClang // expected-error{{private module 'FullyPrivateClang' is imported publicly from the public module 'main'}}
28+
import main // expected-warning{{'implementation-only-import-suggestion-as-error.swift' is part of module 'main'; ignoring import}}

0 commit comments

Comments
 (0)