Skip to content

Commit 315181d

Browse files
committed
[Sema] Set env var to report public import of private modules as an error
The env var ENABLE_PUBLIC_IMPORT_OF_PRIVATE_AS_ERROR must be set for public imports of private module to be reported as an error, otherwise it's still a warning.
1 parent e2fa682 commit 315181d

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1715,6 +1715,10 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
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}}

test/Sema/implementation-only-import-suggestion.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@
3434
// RUN: -library-level other -D PUBLIC_IMPORTS
3535
#if PUBLIC_IMPORTS
3636
import PublicSwift
37-
import PrivateSwift // expected-error{{private module 'PrivateSwift' is imported publicly from the public module 'main'}}
37+
import PrivateSwift // expected-warning{{private module 'PrivateSwift' is imported publicly from the public module 'main'}}
3838

3939
import PublicClang
40-
import PublicClang_Private // expected-error{{private module 'PublicClang_Private' is imported publicly from the public module 'main'}}
41-
import FullyPrivateClang // expected-error{{private module 'FullyPrivateClang' is imported publicly from the public module 'main'}}
40+
import PublicClang_Private // expected-warning{{private module 'PublicClang_Private' is imported publicly from the public module 'main'}}
41+
import FullyPrivateClang // expected-warning{{private module 'FullyPrivateClang' is imported publicly from the public module 'main'}}
4242
import main // expected-warning{{'implementation-only-import-suggestion.swift' is part of module 'main'; ignoring import}}
4343

4444
/// Expect no warnings with implementation-only imports.

0 commit comments

Comments
 (0)