You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Sema: Diagnose availability of accessors in chained assignments.
In the following example, the writeback via the property `b` should be
diagnosed since `b`'s setter is unavailable:
```
struct A {
struct B {
var x: Int = 0
}
private var _b: B = B()
var b: B {
get { _b }
@available(*, unavailable) set {
_b = newValue
}
}
}
var a = A()
a.b.x = 1
```
Resolves rdar://125019717
x.unavailableGetter[0].b =1 // expected-error {{getter for 'unavailableGetter' is unavailable}}
97
97
98
98
x.unavailableSetter = someValue // expected-error {{setter for 'unavailableSetter' is unavailable}}
99
-
x.unavailableSetter.a = someValue.a // FIXME: missing diagnostic for setter
99
+
x.unavailableSetter.a = someValue.a // expected-error {{setter for 'unavailableSetter' is unavailable}}
100
100
x.unavailableSetter[0]= someValue.a // expected-error {{setter for 'unavailableSetter' is unavailable}}
101
101
x.unavailableSetter[0].b =1 // expected-error {{setter for 'unavailableSetter' is unavailable}}
102
102
103
103
x.unavailableGetterAndSetter = someValue // expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
104
-
x.unavailableGetterAndSetter.a = someValue.a // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} FIXME: missing diagnostic for setter
104
+
x.unavailableGetterAndSetter.a = someValue.a // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
105
105
x.unavailableGetterAndSetter[0]= someValue.a // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
106
106
x.unavailableGetterAndSetter[0].b =1 // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
107
107
}
@@ -128,14 +128,14 @@ func testKeyPathLoads() {
128
128
_ =x[keyPath: \.unavailableSetter.a]
129
129
_ =x[keyPath: \.unavailableSetter[0]]
130
130
_ =x[keyPath: \.unavailableSetter[0].b]
131
-
_ =a[keyPath: \.[takesIntInOut(&x.unavailableSetter.a.b)]] // FIXME: missing diagnostic for setter
131
+
_ =a[keyPath: \.[takesIntInOut(&x.unavailableSetter.a.b)]] // expected-error {{setter for 'unavailableSetter' is unavailable}}
132
132
_ =a[keyPath: \.[takesIntInOut(&x.unavailableSetter[0].b)]] // expected-error {{setter for 'unavailableSetter' is unavailable}}
133
133
134
134
_ =x[keyPath: \.unavailableGetterAndSetter] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
135
135
_ =x[keyPath: \.unavailableGetterAndSetter.a] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
136
136
_ =x[keyPath: \.unavailableGetterAndSetter[0]] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
137
137
_ =x[keyPath: \.unavailableGetterAndSetter[0].b] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
138
-
_ =a[keyPath: \.[takesIntInOut(&x.unavailableGetterAndSetter.a.b)]] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} FIXME: missing diagnostic for setter
138
+
_ =a[keyPath: \.[takesIntInOut(&x.unavailableGetterAndSetter.a.b)]] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} // expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
139
139
_ =a[keyPath: \.[takesIntInOut(&x.unavailableGetterAndSetter[0].b)]] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
x[keyPath: \.unavailableSetter.a]= someValue.a // expected-error {{setter for 'unavailableSetter' is unavailable}}
163
163
x[keyPath: \.unavailableSetter[0]]= someValue.a // expected-error {{setter for 'unavailableSetter' is unavailable}}
164
164
x[keyPath: \.unavailableSetter[0].b]=1 // expected-error {{setter for 'unavailableSetter' is unavailable}}
165
-
a[keyPath: \.[takesIntInOut(&x.unavailableSetter.a.b)]]=0 // FIXME: missing diagnostic for setter
165
+
a[keyPath: \.[takesIntInOut(&x.unavailableSetter.a.b)]]=0 // expected-error {{setter for 'unavailableSetter' is unavailable}}
166
166
a[keyPath: \.[takesIntInOut(&x.unavailableSetter[0].b)]]=0 // expected-error {{setter for 'unavailableSetter' is unavailable}}
167
167
168
168
x[keyPath: \.unavailableGetterAndSetter]= someValue // expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
169
169
x[keyPath: \.unavailableGetterAndSetter.a]= someValue.a // expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
170
170
x[keyPath: \.unavailableGetterAndSetter[0]]= someValue.a // expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
171
171
x[keyPath: \.unavailableGetterAndSetter[0].b]=1 // expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
172
-
a[keyPath: \.[takesIntInOut(&x.unavailableGetterAndSetter.a.b)]]=0 // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} FIXME: missing diagnostic for setter
172
+
a[keyPath: \.[takesIntInOut(&x.unavailableGetterAndSetter.a.b)]]=0 // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
173
173
a[keyPath: \.[takesIntInOut(&x.unavailableGetterAndSetter[0].b)]]=0 // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
174
174
}
175
175
@@ -192,13 +192,13 @@ func testMutatingMember() {
192
192
x.unavailableSetter.setToZero() // expected-error {{setter for 'unavailableSetter' is unavailable}}
193
193
x.unavailableSetter[0].setToZero() // expected-error {{setter for 'unavailableSetter' is unavailable}}
194
194
_ =a[x.unavailableSetter.setToZero()] // expected-error {{setter for 'unavailableSetter' is unavailable}}
195
-
_ =a[x.unavailableSetter.a.setToZero()] // FIXME: missing diagnostic for setter
195
+
_ =a[x.unavailableSetter.a.setToZero()] // expected-error {{setter for 'unavailableSetter' is unavailable}}
196
196
_ =a[x.unavailableSetter[0].setToZero()] // expected-error {{setter for 'unavailableSetter' is unavailable}}
197
197
198
198
x.unavailableGetterAndSetter.setToZero() // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
199
199
x.unavailableGetterAndSetter[0].setToZero() // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
200
200
_ =a[x.unavailableGetterAndSetter.setToZero()] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
201
-
_ =a[x.unavailableGetterAndSetter.a.setToZero()] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} FIXME: should diagnose setter
201
+
_ =a[x.unavailableGetterAndSetter.a.setToZero()] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
202
202
_ =a[x.unavailableGetterAndSetter[0].setToZero()] // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
takesInOut(&x.unavailableGetter[0].b) // expected-error {{getter for 'unavailableGetter' is unavailable}}
219
219
220
220
takesInOut(&x.unavailableSetter) // expected-error {{setter for 'unavailableSetter' is unavailable}}
221
-
takesInOut(&x.unavailableSetter.a) //
221
+
takesInOut(&x.unavailableSetter.a) // expected-error {{setter for 'unavailableSetter' is unavailable}}
222
222
takesInOut(&x.unavailableSetter[0]) // expected-error {{setter for 'unavailableSetter' is unavailable}}
223
223
takesInOut(&x.unavailableSetter[0].b) // expected-error {{setter for 'unavailableSetter' is unavailable}}
224
224
225
225
takesInOut(&x.unavailableGetterAndSetter) // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
226
-
takesInOut(&x.unavailableGetterAndSetter.a) // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} FIXME: missing diagnostic for setter
226
+
takesInOut(&x.unavailableGetterAndSetter.a) // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
227
227
takesInOut(&x.unavailableGetterAndSetter[0]) // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
228
228
takesInOut(&x.unavailableGetterAndSetter[0].b) // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
0 commit comments