Skip to content

Commit f93c66d

Browse files
authored
Merge pull request #69709 from CodaFi/vulf-pack
Fix the Effective Access Level of package Declarations
2 parents 9ea3146 + 52155fe commit f93c66d

File tree

8 files changed

+804
-5
lines changed

8 files changed

+804
-5
lines changed

lib/AST/Decl.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4121,6 +4121,15 @@ AccessLevel ValueDecl::getEffectiveAccess() const {
41214121
case AccessLevel::Open:
41224122
break;
41234123
case AccessLevel::Package:
4124+
if (getModuleContext()->isTestingEnabled() ||
4125+
getModuleContext()->arePrivateImportsEnabled()) {
4126+
effectiveAccess = getMaximallyOpenAccessFor(this);
4127+
} else {
4128+
// Package declarations are effectively public within their
4129+
// package unit.
4130+
effectiveAccess = AccessLevel::Public;
4131+
}
4132+
break;
41244133
case AccessLevel::Public:
41254134
case AccessLevel::Internal:
41264135
if (getModuleContext()->isTestingEnabled() ||

lib/Sema/TypeCheckAttr.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3765,9 +3765,11 @@ TypeEraserHasViableInitRequest::evaluate(Evaluator &evaluator,
37653765
genericParamType, protocol->getName().str());
37663766
break;
37673767
case UnviableReason::Inaccessible:
3768-
diags.diagnose(init->getLoc(), diag::type_eraser_init_not_accessible,
3769-
init->getEffectiveAccess(), protocolType,
3770-
protocol->getEffectiveAccess());
3768+
diags.diagnose(
3769+
init->getLoc(), diag::type_eraser_init_not_accessible,
3770+
init->getFormalAccessScope().requiredAccessForDiagnostics(),
3771+
protocolType,
3772+
protocol->getFormalAccessScope().requiredAccessForDiagnostics());
37713773
break;
37723774
case UnviableReason::SPI:
37733775
diags.diagnose(init->getLoc(), diag::type_eraser_init_spi,
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
2+
import resilient_struct
3+
4+
5+
6+
// Resilient base class
7+
8+
package class ResilientOutsideParent {
9+
package var property: String = "ResilientOutsideParent.property"
10+
package final var finalProperty: String = "ResilientOutsideParent.finalProperty"
11+
12+
package class var classProperty: String {
13+
return "ResilientOutsideParent.classProperty"
14+
}
15+
16+
package init() {
17+
print("ResilientOutsideParent.init()")
18+
}
19+
20+
package func method() {
21+
print("ResilientOutsideParent.method()")
22+
}
23+
24+
package class func classMethod() {
25+
print("ResilientOutsideParent.classMethod()")
26+
}
27+
28+
package func getValue() -> Int {
29+
return 0
30+
}
31+
}
32+
33+
34+
35+
// Resilient subclass
36+
37+
package class ResilientOutsideChild : ResilientOutsideParent {
38+
package override func method() {
39+
print("ResilientOutsideChild.method()")
40+
super.method()
41+
}
42+
43+
package override class func classMethod() {
44+
print("ResilientOutsideChild.classMethod()")
45+
super.classMethod()
46+
}
47+
}
48+
49+
50+
// Resilient generic base class
51+
52+
package class ResilientGenericOutsideParent<A> {
53+
package var property: A
54+
package init(property: A) {
55+
self.property = property
56+
print("ResilientGenericOutsideParent.init()")
57+
}
58+
59+
package func method() {
60+
print("ResilientGenericOutsideParent.method()")
61+
}
62+
63+
package class func classMethod() {
64+
print("ResilientGenericOutsideParent.classMethod()")
65+
}
66+
}
67+
68+
69+
// Resilient generic subclass
70+
71+
package class ResilientGenericOutsideChild<A> : ResilientGenericOutsideParent<A> {
72+
package override init(property: A) {
73+
print("ResilientGenericOutsideGenericChild.init(a: A)")
74+
super.init(property: property)
75+
}
76+
77+
package override func method() {
78+
print("ResilientGenericOutsideChild.method()")
79+
super.method()
80+
}
81+
82+
package override class func classMethod() {
83+
print("ResilientGenericOutsideChild.classMethod()")
84+
super.classMethod()
85+
}
86+
}
87+
88+
89+
// Resilient subclass of generic class
90+
91+
package class ResilientConcreteOutsideChild : ResilientGenericOutsideParent<String> {
92+
package override init(property: String) {
93+
print("ResilientConcreteOutsideChild.init(property: String)")
94+
super.init(property: property)
95+
}
96+
97+
package override func method() {
98+
print("ResilientConcreteOutsideChild.method()")
99+
super.method()
100+
}
101+
102+
package override class func classMethod() {
103+
print("ResilientConcreteOutsideChild.classMethod()")
104+
super.classMethod()
105+
}
106+
}
Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
import resilient_struct
2+
3+
// Fixed-layout enum with resilient members
4+
package enum SimpleShape {
5+
case KleinBottle
6+
case Triangle(Size)
7+
}
8+
9+
// Fixed-layout enum with resilient members
10+
package enum Shape {
11+
case Point
12+
case Rect(Size)
13+
case RoundedRect(Size, Size)
14+
}
15+
16+
// Fixed-layout enum with indirect resilient members
17+
package enum FunnyShape {
18+
indirect case Parallelogram(Size)
19+
indirect case Trapezoid(Size)
20+
}
21+
22+
package enum FullyFixedLayout {
23+
case noPayload
24+
case hasPayload(Int)
25+
}
26+
27+
// The enum payload has fixed layout inside this module, but
28+
// resilient layout outside. Make sure we emit the payload
29+
// size in the metadata.
30+
31+
package struct Color {
32+
package let r: Int, g: Int, b: Int
33+
34+
package init(r: Int, g: Int, b: Int) {
35+
self.r = r
36+
self.g = g
37+
self.b = b
38+
}
39+
}
40+
41+
package enum CustomColor {
42+
case Black
43+
case White
44+
case Custom(Color)
45+
case Bespoke(Color, Color)
46+
}
47+
48+
// Resilient enum
49+
package enum Medium {
50+
// Indirect case
51+
indirect case Pamphlet(Medium) // -1
52+
53+
// Case with resilient payload
54+
case Postcard(Size) // -2
55+
56+
// Empty cases
57+
case Paper // 0
58+
case Canvas // 1
59+
}
60+
61+
// Indirect resilient enum
62+
package indirect enum IndirectApproach {
63+
case Angle(Double) // -1
64+
}
65+
66+
// Resilient enum with resilient empty payload case
67+
package struct EmptyStruct {
68+
package init() {}
69+
}
70+
71+
package enum ResilientEnumWithEmptyCase {
72+
case A // 0
73+
case B // 1
74+
case Empty(EmptyStruct) // -1
75+
}
76+
77+
package func getResilientEnumWithEmptyCase() -> [ResilientEnumWithEmptyCase] {
78+
return [.A, .B, .Empty(EmptyStruct())]
79+
}
80+
81+
// Specific enum implementations for executable tests
82+
package enum ResilientEmptyEnum {
83+
case X
84+
}
85+
86+
package enum ResilientSingletonEnum {
87+
case X(AnyObject)
88+
}
89+
90+
package enum ResilientSingletonGenericEnum<T> {
91+
case X(T)
92+
}
93+
94+
package enum ResilientNoPayloadEnum {
95+
case A
96+
case B
97+
case C
98+
}
99+
100+
package enum ResilientSinglePayloadEnum {
101+
case X(AnyObject) // -1
102+
case A // 0
103+
case B // 1
104+
case C // 2
105+
}
106+
107+
package enum ResilientSinglePayloadGenericEnum<T> {
108+
case X(T) // -1
109+
case A // 0
110+
case B // 1
111+
case C // 2
112+
}
113+
114+
package class ArtClass {
115+
package init() {}
116+
}
117+
118+
package enum ResilientMultiPayloadEnum {
119+
case A
120+
case B
121+
case C
122+
case X(Int)
123+
case Y(Int)
124+
}
125+
126+
package func makeResilientMultiPayloadEnum(_ n: Int, i: Int)
127+
-> ResilientMultiPayloadEnum {
128+
switch i {
129+
case 0:
130+
return .A
131+
case 1:
132+
return .B
133+
case 2:
134+
return .C
135+
case 3:
136+
return .X(n)
137+
case 4:
138+
return .Y(n)
139+
default:
140+
while true {}
141+
}
142+
}
143+
144+
package enum ResilientMultiPayloadEnumSpareBits {
145+
case A // 0
146+
case B // 1
147+
case C // 2
148+
case X(ArtClass) // -1
149+
case Y(ArtClass) // -2
150+
}
151+
152+
package func makeResilientMultiPayloadEnumSpareBits(_ o: ArtClass, i: Int)
153+
-> ResilientMultiPayloadEnumSpareBits {
154+
switch i {
155+
case 0:
156+
return .A
157+
case 1:
158+
return .B
159+
case 2:
160+
return .C
161+
case 3:
162+
return .X(o)
163+
case 4:
164+
return .Y(o)
165+
default:
166+
while true {}
167+
}
168+
}
169+
170+
package typealias SevenSpareBits = (Bool, Int8, Int8, Int8, Int8, Int8, Int8, Int8)
171+
172+
package enum ResilientMultiPayloadEnumSpareBitsAndExtraBits {
173+
// On 64-bit little endian, 7 spare bits at the LSB end
174+
case P1(SevenSpareBits)
175+
// On 64-bit, 8 spare bits at the MSB end and 3 at the LSB end
176+
case P2(ArtClass)
177+
case P3(ArtClass)
178+
case P4(ArtClass)
179+
case P5(ArtClass)
180+
case P6(ArtClass)
181+
case P7(ArtClass)
182+
case P8(ArtClass)
183+
}
184+
185+
package enum ResilientMultiPayloadGenericEnum<T> {
186+
case A // 0
187+
case B // 1
188+
case C // 2
189+
case X(T) // -1
190+
case Y(T) // -2
191+
}
192+
193+
package enum ResilientMultiPayloadGenericEnumFixedSize<T> {
194+
case A // 0
195+
case B // 1
196+
case C // 2
197+
case X(Int) // -1
198+
case Y(Int) // -2
199+
}
200+
201+
package enum ResilientIndirectEnum {
202+
// 0
203+
case Base
204+
205+
// -1
206+
indirect case A(ResilientIndirectEnum)
207+
208+
// -2
209+
indirect case B(ResilientIndirectEnum, ResilientIndirectEnum)
210+
}
211+
212+
package enum ResilientEnumWithUnavailableCase {
213+
case available
214+
215+
@available(*, unavailable)
216+
case unavailable
217+
}

0 commit comments

Comments
 (0)