Skip to content

Commit dc74591

Browse files
authored
Merge pull request #78718 from xymus/fix-importing-non-visible-decls-6.1
[6.1] Sema: Ensure access-level on imports only applies to visible imported decls
2 parents b0c7f61 + 5b6ab66 commit dc74591

File tree

3 files changed

+205
-1
lines changed

3 files changed

+205
-1
lines changed

lib/AST/Decl.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4660,7 +4660,11 @@ getAccessScopeForFormalAccess(const ValueDecl *VD,
46604660
if (localImportRestriction.has_value()) {
46614661
AccessLevel importAccessLevel =
46624662
localImportRestriction.value().accessLevel;
4663-
if (access > importAccessLevel) {
4663+
auto isVisible = access >= AccessLevel::Public ||
4664+
(access == AccessLevel::Package &&
4665+
useDC->getParentModule()->inSamePackage(resultDC->getParentModule()));
4666+
4667+
if (access > importAccessLevel && isVisible) {
46644668
access = std::min(access, importAccessLevel);
46654669
resultDC = useDC->getParentSourceFile();
46664670
}
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
/// Ensure we only bump down the access-level of imported decls, not up.
2+
3+
// RUN: %empty-directory(%t)
4+
// RUN: split-file %s %t
5+
6+
/// Build libraries
7+
// RUN: %target-swift-frontend -emit-module %t/ImportedPrivate.swift \
8+
// RUN: -enable-library-evolution -swift-version 5 \
9+
// RUN: -package-name pkg \
10+
// RUN: -emit-module-path %t/ImportedPrivate.swiftmodule
11+
// RUN: %target-swift-frontend -emit-module %t/ImportedInternal.swift \
12+
// RUN: -enable-library-evolution -swift-version 5 \
13+
// RUN: -package-name pkg \
14+
// RUN: -emit-module-path %t/ImportedInternal.swiftmodule -I %t
15+
// RUN: %target-swift-frontend -emit-module %t/ImportedPackage.swift \
16+
// RUN: -enable-library-evolution -swift-version 5 \
17+
// RUN: -package-name pkg \
18+
// RUN: -emit-module-path %t/ImportedPackage.swiftmodule -I %t
19+
// RUN: %target-swift-frontend -emit-module %t/ImportedPublic.swift \
20+
// RUN: -enable-library-evolution -swift-version 5 \
21+
// RUN: -package-name pkg \
22+
// RUN: -emit-module-path %t/ImportedPublic.swiftmodule -I %t
23+
24+
/// Build clients
25+
// RUN: %target-swift-frontend -typecheck %t/InPackageClient.swift -I %t \
26+
// RUN: -enable-library-evolution -swift-version 5 \
27+
// RUN: -package-name pkg -verify
28+
// RUN: %target-swift-frontend -typecheck %t/OutOfPackageClient.swift -I %t \
29+
// RUN: -enable-library-evolution -swift-version 5 \
30+
// RUN: -verify
31+
32+
//--- ImportedPrivate.swift
33+
34+
private func privateFunc() {}
35+
internal func internalFunc() {}
36+
package func packageFunc() {}
37+
public func publicFunc() {}
38+
39+
//--- ImportedInternal.swift
40+
41+
private func privateFunc() {}
42+
internal func internalFunc() {}
43+
package func packageFunc() {}
44+
public func publicFunc() {}
45+
46+
//--- ImportedPackage.swift
47+
48+
private func privateFunc() {}
49+
internal func internalFunc() {}
50+
package func packageFunc() {}
51+
public func publicFunc() {}
52+
53+
//--- ImportedPublic.swift
54+
55+
private func privateFunc() {}
56+
internal func internalFunc() {}
57+
package func packageFunc() {}
58+
public func publicFunc() {}
59+
60+
//--- InPackageClient.swift
61+
62+
private import ImportedPrivate
63+
internal import ImportedInternal
64+
private import ImportedPackage
65+
public import ImportedPublic // expected-warning{{public import of 'ImportedPublic' was not used in public declarations or inlinable code}}
66+
67+
ImportedPrivate.privateFunc() // expected-error {{module 'ImportedPrivate' has no member named 'privateFunc'}}
68+
ImportedPrivate.internalFunc() // expected-error {{module 'ImportedPrivate' has no member named 'internalFunc'}}
69+
ImportedPrivate.packageFunc()
70+
ImportedPrivate.publicFunc()
71+
72+
ImportedInternal.privateFunc() // expected-error {{module 'ImportedInternal' has no member named 'privateFunc'}}
73+
ImportedInternal.internalFunc() // expected-error {{module 'ImportedInternal' has no member named 'internalFunc'}}
74+
ImportedInternal.packageFunc()
75+
ImportedInternal.publicFunc()
76+
77+
ImportedPackage.privateFunc() // expected-error {{module 'ImportedPackage' has no member named 'privateFunc'}}
78+
ImportedPackage.internalFunc() // expected-error {{module 'ImportedPackage' has no member named 'internalFunc'}}
79+
ImportedPackage.packageFunc()
80+
ImportedPackage.publicFunc()
81+
82+
ImportedPublic.privateFunc() // expected-error {{module 'ImportedPublic' has no member named 'privateFunc'}}
83+
ImportedPublic.internalFunc() // expected-error {{module 'ImportedPublic' has no member named 'internalFunc'}}
84+
ImportedPublic.packageFunc()
85+
ImportedPublic.publicFunc()
86+
87+
func funcContext() {
88+
ImportedPrivate.privateFunc() // expected-error {{module 'ImportedPrivate' has no member named 'privateFunc'}}
89+
ImportedPrivate.internalFunc() // expected-error {{module 'ImportedPrivate' has no member named 'internalFunc'}}
90+
ImportedPrivate.packageFunc()
91+
ImportedPrivate.publicFunc()
92+
93+
ImportedInternal.privateFunc() // expected-error {{module 'ImportedInternal' has no member named 'privateFunc'}}
94+
ImportedInternal.internalFunc() // expected-error {{module 'ImportedInternal' has no member named 'internalFunc'}}
95+
ImportedInternal.packageFunc()
96+
ImportedInternal.publicFunc()
97+
98+
ImportedPackage.privateFunc() // expected-error {{module 'ImportedPackage' has no member named 'privateFunc'}}
99+
ImportedPackage.internalFunc() // expected-error {{module 'ImportedPackage' has no member named 'internalFunc'}}
100+
ImportedPackage.packageFunc()
101+
ImportedPackage.publicFunc()
102+
103+
ImportedPublic.privateFunc() // expected-error {{module 'ImportedPublic' has no member named 'privateFunc'}}
104+
ImportedPublic.internalFunc() // expected-error {{module 'ImportedPublic' has no member named 'internalFunc'}}
105+
ImportedPublic.packageFunc()
106+
ImportedPublic.publicFunc()
107+
}
108+
109+
//--- OutOfPackageClient.swift
110+
111+
private import ImportedPrivate
112+
internal import ImportedInternal
113+
private import ImportedPackage
114+
public import ImportedPublic // expected-warning{{public import of 'ImportedPublic' was not used in public declarations or inlinable code}}
115+
116+
ImportedPrivate.privateFunc() // expected-error {{module 'ImportedPrivate' has no member named 'privateFunc'}}
117+
ImportedPrivate.internalFunc() // expected-error {{module 'ImportedPrivate' has no member named 'internalFunc'}}
118+
ImportedPrivate.packageFunc() // expected-error {{module 'ImportedPrivate' has no member named 'packageFunc'}}
119+
ImportedPrivate.publicFunc()
120+
121+
ImportedInternal.privateFunc() // expected-error {{module 'ImportedInternal' has no member named 'privateFunc'}}
122+
ImportedInternal.internalFunc() // expected-error {{module 'ImportedInternal' has no member named 'internalFunc'}}
123+
ImportedInternal.packageFunc() // expected-error {{module 'ImportedInternal' has no member named 'packageFunc'}}
124+
ImportedInternal.publicFunc()
125+
126+
ImportedPackage.privateFunc() // expected-error {{module 'ImportedPackage' has no member named 'privateFunc'}}
127+
ImportedPackage.internalFunc() // expected-error {{module 'ImportedPackage' has no member named 'internalFunc'}}
128+
ImportedPackage.packageFunc() // expected-error {{module 'ImportedPackage' has no member named 'packageFunc'}}
129+
ImportedPackage.publicFunc()
130+
131+
ImportedPublic.privateFunc() // expected-error {{module 'ImportedPublic' has no member named 'privateFunc'}}
132+
ImportedPublic.internalFunc() // expected-error {{module 'ImportedPublic' has no member named 'internalFunc'}}
133+
ImportedPublic.packageFunc() // expected-error {{module 'ImportedPublic' has no member named 'packageFunc'}}
134+
ImportedPublic.publicFunc()
135+
136+
func funcContext() {
137+
ImportedPrivate.privateFunc() // expected-error {{module 'ImportedPrivate' has no member named 'privateFunc'}}
138+
ImportedPrivate.internalFunc() // expected-error {{module 'ImportedPrivate' has no member named 'internalFunc'}}
139+
ImportedPrivate.packageFunc() // expected-error {{module 'ImportedPrivate' has no member named 'packageFunc'}}
140+
ImportedPrivate.publicFunc()
141+
142+
ImportedInternal.privateFunc() // expected-error {{module 'ImportedInternal' has no member named 'privateFunc'}}
143+
ImportedInternal.internalFunc() // expected-error {{module 'ImportedInternal' has no member named 'internalFunc'}}
144+
ImportedInternal.packageFunc() // expected-error {{module 'ImportedInternal' has no member named 'packageFunc'}}
145+
ImportedInternal.publicFunc()
146+
147+
ImportedPackage.privateFunc() // expected-error {{module 'ImportedPackage' has no member named 'privateFunc'}}
148+
ImportedPackage.internalFunc() // expected-error {{module 'ImportedPackage' has no member named 'internalFunc'}}
149+
ImportedPackage.packageFunc() // expected-error {{module 'ImportedPackage' has no member named 'packageFunc'}}
150+
ImportedPackage.publicFunc()
151+
152+
ImportedPublic.privateFunc() // expected-error {{module 'ImportedPublic' has no member named 'privateFunc'}}
153+
ImportedPublic.internalFunc() // expected-error {{module 'ImportedPublic' has no member named 'internalFunc'}}
154+
ImportedPublic.packageFunc() // expected-error {{module 'ImportedPublic' has no member named 'packageFunc'}}
155+
ImportedPublic.publicFunc()
156+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: split-file %s %t
3+
4+
/// Build libraries
5+
// RUN: %target-swift-frontend -emit-module %t/LibShared.swift \
6+
// RUN: -enable-library-evolution -swift-version 5 \
7+
// RUN: -emit-module-path %t/LibShared.swiftmodule
8+
// RUN: %target-swift-frontend -emit-module %t/LibWithPublicFoo.swift \
9+
// RUN: -enable-library-evolution -swift-version 5 \
10+
// RUN: -emit-module-path %t/LibWithPublicFoo.swiftmodule -I %t
11+
// RUN: %target-swift-frontend -emit-module %t/LibWithInternalFoo.swift \
12+
// RUN: -enable-library-evolution -swift-version 5 \
13+
// RUN: -emit-module-path %t/LibWithInternalFoo.swiftmodule -I %t
14+
15+
/// Build client
16+
// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t \
17+
// RUN: -enable-library-evolution -swift-version 5
18+
19+
//--- LibShared.swift
20+
public struct Struct {
21+
public init() {}
22+
}
23+
24+
//--- LibWithPublicFoo.swift
25+
import LibShared
26+
27+
extension Struct {
28+
public func foo() {}
29+
}
30+
31+
//--- LibWithInternalFoo.swift
32+
import LibShared
33+
34+
extension Struct {
35+
internal func foo() {}
36+
}
37+
38+
//--- Client.swift
39+
import LibShared
40+
import LibWithPublicFoo
41+
private import LibWithInternalFoo
42+
43+
var s = Struct()
44+
s.foo() // This is non-ambiguous

0 commit comments

Comments
 (0)