Skip to content

Commit e055b38

Browse files
committed
Tests: Add test cases to availability_accessors.swift using classes.
Many of the new FIXMEs demonstrate the regression reported in rdar://129679658.
1 parent f0ff799 commit e055b38

File tree

1 file changed

+195
-10
lines changed

1 file changed

+195
-10
lines changed

test/Sema/availability_accessors.swift

Lines changed: 195 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,34 +39,55 @@ struct StructValue: ValueProto {
3939
}
4040
}
4141

42+
class ClassValue: ValueProto {
43+
static var defaultValue: Self { .init(a: Nested(b: 1)) }
44+
45+
var a: Nested
46+
47+
required init(a: Nested) {
48+
self.a = a
49+
}
50+
51+
subscript(_ i: Int) -> Nested {
52+
get { a }
53+
set { a = newValue }
54+
}
55+
56+
@discardableResult func setToZero() -> Int {
57+
let prev = a.b
58+
a.setToZero()
59+
return prev
60+
}
61+
}
62+
4263
struct BaseStruct<T: ValueProto> {
4364
var available: T = .defaultValue
4465

4566
var unavailableGetter: T {
4667
@available(*, unavailable)
47-
get { fatalError() } // expected-note 28 {{getter for 'unavailableGetter' has been explicitly marked unavailable here}}
68+
get { fatalError() } // expected-note 46 {{getter for 'unavailableGetter' has been explicitly marked unavailable here}}
4869
set {}
4970
}
5071

5172
var unavailableSetter: T {
5273
get { .defaultValue }
5374
@available(*, unavailable)
54-
set { fatalError() } // expected-note 21 {{setter for 'unavailableSetter' has been explicitly marked unavailable here}}
75+
set { fatalError() } // expected-note 37 {{setter for 'unavailableSetter' has been explicitly marked unavailable here}}
5576
}
5677

5778
var unavailableGetterAndSetter: T {
5879
@available(*, unavailable)
59-
get { fatalError() } // expected-note 28 {{getter for 'unavailableGetterAndSetter' has been explicitly marked unavailable here}}
80+
get { fatalError() } // expected-note 46 {{getter for 'unavailableGetterAndSetter' has been explicitly marked unavailable here}}
6081
@available(*, unavailable)
61-
set { fatalError() } // expected-note 21 {{setter for 'unavailableGetterAndSetter' has been explicitly marked unavailable here}}
82+
set { fatalError() } // expected-note 37 {{setter for 'unavailableGetterAndSetter' has been explicitly marked unavailable here}}
6283
}
6384
}
6485

6586
func takesIntInOut(_ i: inout Int) -> Int {
6687
return 0
6788
}
6889

69-
func testRValueLoads() {
90+
func testRValueLoads_Struct() {
7091
var x = BaseStruct<StructValue>() // expected-warning {{variable 'x' was never mutated; consider changing to 'let' constant}}
7192

7293
_ = x.available
@@ -90,7 +111,31 @@ func testRValueLoads() {
90111
_ = x.unavailableGetterAndSetter[0].b // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
91112
}
92113

93-
func testLValueAssignments(_ someValue: StructValue) {
114+
func testRValueLoads_Class() {
115+
var x = BaseStruct<ClassValue>() // expected-warning {{variable 'x' was never mutated; consider changing to 'let' constant}}
116+
117+
_ = x.available
118+
_ = x.available.a
119+
_ = x.available[0]
120+
_ = x.available[0].b
121+
122+
_ = x.unavailableGetter // expected-error {{getter for 'unavailableGetter' is unavailable}}
123+
_ = x.unavailableGetter.a // expected-error {{getter for 'unavailableGetter' is unavailable}}
124+
_ = x.unavailableGetter[0] // expected-error {{getter for 'unavailableGetter' is unavailable}}
125+
_ = x.unavailableGetter[0].b // expected-error {{getter for 'unavailableGetter' is unavailable}}
126+
127+
_ = x.unavailableSetter
128+
_ = x.unavailableSetter.a
129+
_ = x.unavailableSetter[0]
130+
_ = x.unavailableSetter[0].b
131+
132+
_ = x.unavailableGetterAndSetter // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
133+
_ = x.unavailableGetterAndSetter.a // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
134+
_ = x.unavailableGetterAndSetter[0] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
135+
_ = x.unavailableGetterAndSetter[0].b // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
136+
}
137+
138+
func testLValueAssignments_Struct(_ someValue: StructValue) {
94139
var x = BaseStruct<StructValue>()
95140

96141
x.available = someValue
@@ -114,7 +159,38 @@ func testLValueAssignments(_ someValue: StructValue) {
114159
x.unavailableGetterAndSetter[0].b = 1 // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
115160
}
116161

117-
func testKeyPathLoads() {
162+
func testLValueAssignments_Class(_ someValue: ClassValue) {
163+
var x = BaseStruct<ClassValue>()
164+
165+
x.available = someValue
166+
x.available.a = someValue.a
167+
x.available[0] = someValue.a
168+
x.available[0].b = 1
169+
170+
x.unavailableGetter = someValue
171+
x.unavailableGetter.a = someValue.a // expected-error {{getter for 'unavailableGetter' is unavailable}}
172+
x.unavailableGetter[0] = someValue.a // FIXME: missing diagnostic for getter
173+
x.unavailableGetter[0].b = 1 // expected-error {{getter for 'unavailableGetter' is unavailable}}
174+
175+
x.unavailableSetter = someValue // expected-error {{setter for 'unavailableSetter' is unavailable}}
176+
// FIXME: spurious unavailable setter error
177+
x.unavailableSetter.a = someValue.a // expected-error {{setter for 'unavailableSetter' is unavailable}}
178+
// FIXME: spurious unavailable setter error
179+
x.unavailableSetter[0] = someValue.a // expected-error {{setter for 'unavailableSetter' is unavailable}}
180+
// FIXME: spurious unavailable setter error
181+
x.unavailableSetter[0].b = 1 // expected-error {{setter for 'unavailableSetter' is unavailable}}
182+
183+
x.unavailableGetterAndSetter = someValue // expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
184+
// FIXME: spurious unavailable setter error
185+
x.unavailableGetterAndSetter.a = someValue.a // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
186+
// FIXME: missing diagnostic for getter
187+
// FIXME: spurious unavailable setter error
188+
x.unavailableGetterAndSetter[0] = someValue.a // expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
189+
// FIXME: spurious unavailable setter error
190+
x.unavailableGetterAndSetter[0].b = 1 // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
191+
}
192+
193+
func testKeyPathLoads_Struct() {
118194
let a = [0]
119195
var x = BaseStruct<StructValue>()
120196

@@ -147,7 +223,42 @@ func testKeyPathLoads() {
147223
_ = a[keyPath: \.[takesIntInOut(&x.unavailableGetterAndSetter[0].b)]] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
148224
}
149225

150-
func testKeyPathAssignments(_ someValue: StructValue) {
226+
func testKeyPathLoads_Class() {
227+
let a = [0]
228+
var x = BaseStruct<ClassValue>() // expected-warning {{variable 'x' was never mutated; consider changing to 'let' constant}}
229+
230+
_ = x[keyPath: \.available]
231+
_ = x[keyPath: \.available.a]
232+
_ = x[keyPath: \.available[0]]
233+
_ = x[keyPath: \.available[0].b]
234+
_ = a[keyPath: \.[takesIntInOut(&x.available.a.b)]]
235+
_ = a[keyPath: \.[takesIntInOut(&x.available[0].b)]]
236+
237+
_ = x[keyPath: \.unavailableGetter] // expected-error {{getter for 'unavailableGetter' is unavailable}}
238+
_ = x[keyPath: \.unavailableGetter.a] // expected-error {{getter for 'unavailableGetter' is unavailable}}
239+
_ = x[keyPath: \.unavailableGetter[0]] // expected-error {{getter for 'unavailableGetter' is unavailable}}
240+
_ = x[keyPath: \.unavailableGetter[0].b] // expected-error {{getter for 'unavailableGetter' is unavailable}}
241+
_ = a[keyPath: \.[takesIntInOut(&x.unavailableGetter.a.b)]] // expected-error {{getter for 'unavailableGetter' is unavailable}}
242+
_ = a[keyPath: \.[takesIntInOut(&x.unavailableGetter[0].b)]] // expected-error {{getter for 'unavailableGetter' is unavailable}}
243+
244+
_ = x[keyPath: \.unavailableSetter]
245+
_ = x[keyPath: \.unavailableSetter.a]
246+
_ = x[keyPath: \.unavailableSetter[0]]
247+
_ = x[keyPath: \.unavailableSetter[0].b]
248+
_ = a[keyPath: \.[takesIntInOut(&x.unavailableSetter.a.b)]] // expected-error {{setter for 'unavailableSetter' is unavailable}}
249+
_ = a[keyPath: \.[takesIntInOut(&x.unavailableSetter[0].b)]] // expected-error {{setter for 'unavailableSetter' is unavailable}}
250+
251+
_ = x[keyPath: \.unavailableGetterAndSetter] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
252+
_ = x[keyPath: \.unavailableGetterAndSetter.a] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
253+
_ = x[keyPath: \.unavailableGetterAndSetter[0]] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
254+
_ = x[keyPath: \.unavailableGetterAndSetter[0].b] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
255+
// FIXME: spurious unavailable setter error
256+
_ = a[keyPath: \.[takesIntInOut(&x.unavailableGetterAndSetter.a.b)]] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} // expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
257+
// FIXME: spurious unavailable setter error
258+
_ = a[keyPath: \.[takesIntInOut(&x.unavailableGetterAndSetter[0].b)]] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
259+
}
260+
261+
func testKeyPathAssignments_Struct(_ someValue: StructValue) {
151262
var a = [0]
152263
var x = BaseStruct<StructValue>()
153264

@@ -181,7 +292,49 @@ func testKeyPathAssignments(_ someValue: StructValue) {
181292
a[keyPath: \.[takesIntInOut(&x.unavailableGetterAndSetter[0].b)]] = 0 // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
182293
}
183294

184-
func testMutatingMember() {
295+
func testKeyPathAssignments_Class(_ someValue: ClassValue) {
296+
var a = [0]
297+
var x = BaseStruct<ClassValue>()
298+
299+
x[keyPath: \.available] = someValue
300+
x[keyPath: \.available.a] = someValue.a
301+
x[keyPath: \.available[0]] = someValue.a
302+
x[keyPath: \.available[0].b] = 1
303+
x[keyPath: \.available] = someValue
304+
a[keyPath: \.[takesIntInOut(&x.available.a.b)]] = 0
305+
a[keyPath: \.[takesIntInOut(&x.available[0].b)]] = 0
306+
307+
x[keyPath: \.unavailableGetter] = someValue
308+
x[keyPath: \.unavailableGetter.a] = someValue.a // FIXME: missing diagnostic for getter
309+
x[keyPath: \.unavailableGetter[0]] = someValue.a // FIXME: missing diagnostic for getter
310+
x[keyPath: \.unavailableGetter[0].b] = 1 // FIXME: missing diagnostic for getter
311+
a[keyPath: \.[takesIntInOut(&x.unavailableGetter.a.b)]] = 0 // expected-error {{getter for 'unavailableGetter' is unavailable}}
312+
a[keyPath: \.[takesIntInOut(&x.unavailableGetter[0].b)]] = 0 // expected-error {{getter for 'unavailableGetter' is unavailable}}
313+
314+
x[keyPath: \.unavailableSetter] = someValue // expected-error {{setter for 'unavailableSetter' is unavailable}}
315+
// FIXME: spurious unavailable setter error
316+
x[keyPath: \.unavailableSetter.a] = someValue.a // expected-error {{setter for 'unavailableSetter' is unavailable}}
317+
// FIXME: spurious unavailable setter error
318+
x[keyPath: \.unavailableSetter[0]] = someValue.a // expected-error {{setter for 'unavailableSetter' is unavailable}}
319+
// FIXME: spurious unavailable setter error
320+
x[keyPath: \.unavailableSetter[0].b] = 1 // expected-error {{setter for 'unavailableSetter' is unavailable}}
321+
// FIXME: spurious unavailable setter error
322+
a[keyPath: \.[takesIntInOut(&x.unavailableSetter.a.b)]] = 0 // expected-error {{setter for 'unavailableSetter' is unavailable}}
323+
// FIXME: spurious unavailable setter error
324+
a[keyPath: \.[takesIntInOut(&x.unavailableSetter[0].b)]] = 0 // expected-error {{setter for 'unavailableSetter' is unavailable}}
325+
326+
x[keyPath: \.unavailableGetterAndSetter] = someValue // expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
327+
x[keyPath: \.unavailableGetterAndSetter.a] = someValue.a // expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
328+
x[keyPath: \.unavailableGetterAndSetter[0]] = someValue.a // expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
329+
// FIXME: spurious unavailable setter error
330+
x[keyPath: \.unavailableGetterAndSetter[0].b] = 1 // expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
331+
// FIXME: spurious unavailable setter error
332+
a[keyPath: \.[takesIntInOut(&x.unavailableGetterAndSetter.a.b)]] = 0 // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
333+
// FIXME: spurious unavailable setter error
334+
a[keyPath: \.[takesIntInOut(&x.unavailableGetterAndSetter[0].b)]] = 0 // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
335+
}
336+
337+
func testMutatingStructMember() {
185338
var x = BaseStruct<StructValue>()
186339
let a = [0]
187340

@@ -210,7 +363,7 @@ func testMutatingMember() {
210363
_ = a[x.unavailableGetterAndSetter[0].setToZero()] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
211364
}
212365

213-
func testPassAsInOutParameter() {
366+
func testPassAsInOutParameter_Struct() {
214367
func takesInOut<T>(_ t: inout T) {}
215368

216369
var x = BaseStruct<StructValue>()
@@ -236,6 +389,38 @@ func testPassAsInOutParameter() {
236389
takesInOut(&x.unavailableGetterAndSetter[0].b) // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
237390
}
238391

392+
func testPassAsInOutParameter_Class() {
393+
func takesInOut<T>(_ t: inout T) {}
394+
395+
var x = BaseStruct<ClassValue>()
396+
397+
takesInOut(&x.available)
398+
takesInOut(&x.available.a)
399+
takesInOut(&x.available[0])
400+
takesInOut(&x.available[0].b)
401+
402+
takesInOut(&x.unavailableGetter) // expected-error {{getter for 'unavailableGetter' is unavailable}}
403+
takesInOut(&x.unavailableGetter.a) // expected-error {{getter for 'unavailableGetter' is unavailable}}
404+
takesInOut(&x.unavailableGetter[0]) // expected-error {{getter for 'unavailableGetter' is unavailable}}
405+
takesInOut(&x.unavailableGetter[0].b) // expected-error {{getter for 'unavailableGetter' is unavailable}}
406+
407+
takesInOut(&x.unavailableSetter) // expected-error {{setter for 'unavailableSetter' is unavailable}}
408+
// FIXME: spurious unavailable setter error
409+
takesInOut(&x.unavailableSetter.a) // expected-error {{setter for 'unavailableSetter' is unavailable}}
410+
// FIXME: spurious unavailable setter error
411+
takesInOut(&x.unavailableSetter[0]) // expected-error {{setter for 'unavailableSetter' is unavailable}}
412+
// FIXME: spurious unavailable setter error
413+
takesInOut(&x.unavailableSetter[0].b) // expected-error {{setter for 'unavailableSetter' is unavailable}}
414+
415+
takesInOut(&x.unavailableGetterAndSetter) // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
416+
// FIXME: spurious unavailable setter error
417+
takesInOut(&x.unavailableGetterAndSetter.a) // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
418+
// FIXME: spurious unavailable setter error
419+
takesInOut(&x.unavailableGetterAndSetter[0]) // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
420+
// FIXME: spurious unavailable setter error
421+
takesInOut(&x.unavailableGetterAndSetter[0].b) // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
422+
}
423+
239424
var global = BaseStruct<StructValue>()
240425

241426
struct TestPatternBindingInitExprs {

0 commit comments

Comments
 (0)