@@ -6,6 +6,27 @@ struct TestInit {
6
6
var full : ( Int , Int )
7
7
8
8
var point : ( Int , Int ) {
9
+ // CHECK-LABEL: sil private @$s14init_accessors8TestInitV5pointSi_Sitvi : $@convention(thin) (Int, Int, @inout Int) -> (@out Int, @out (Int, Int))
10
+ // CHECK: bb0([[Y_REF:%.*]] : $*Int, [[FULL_REF:%.*]] : $*(Int, Int), [[X_VAL:%.*]] : $Int, [[Y_VAL:%.*]] : $Int, [[X_REF:%.*]] : $*Int):
11
+ //
12
+ // CHECK: [[Y_ACCESS:%.*]] = begin_access [modify] [static] [[Y_REF]] : $*Int
13
+ // CHECK-NEXT: store [[Y_VAL]] to [[Y_ACCESS]] : $*Int
14
+ // CHECK-NEXT: end_access [[Y_ACCESS]] : $*Int
15
+ //
16
+ // CHECK-NEXT: [[X_ACCESS:%.*]] = begin_access [read] [static] [[X_REF]] : $*Int
17
+ // CHECK-NEXT: [[X_VAL:%.*]] = load [[X_ACCESS]] : $*Int
18
+ // CHECK-NEXT: end_access [[X_ACCESS]] : $*Int
19
+ //
20
+ // CHECK-NEXT: [[Y_ACCESS:%.*]] = begin_access [read] [static] [[Y_REF]] : $*Int
21
+ // CHECK-NEXT: [[Y_VAL:%.*]] = load [[Y_ACCESS]] : $*Int
22
+ // CHECK-NEXT: end_access [[Y_ACCESS]] : $*Int
23
+ //
24
+ // CHECK-NEXT: [[FULL_ACCESS:%.*]] = begin_access [modify] [static] [[FULL_REF]] : $*(Int, Int)
25
+ // CHECK-NEXT: [[FULL_ELT_0:%.*]] = tuple_element_addr [[FULL_ACCESS]] : $*(Int, Int), 0
26
+ // CHECK-NEXT: store [[X_VAL]] to [[FULL_ELT_0]] : $*Int
27
+ // CHECK-NEXT: [[FULL_ELT_1:%.*]] = tuple_element_addr [[FULL_ACCESS]] : $*(Int, Int), 1
28
+ // CHECK-NEXT: store [[Y_VAL]] to [[FULL_ELT_1]] : $*Int
29
+ // CHECK-NEXT: end_access [[FULL_ACCESS]] : $*(Int, Int)
9
30
init ( initialValue) initializes( y full) accesses( x) {
10
31
self . y = initialValue. 1
11
32
self . full = ( self . x, self . y)
@@ -16,13 +37,14 @@ struct TestInit {
16
37
}
17
38
18
39
// CHECK-LABEL: sil hidden @$s14init_accessors8TestInitV1x1yACSi_SitcfC : $@convention(method) (Int, Int, @thin TestInit.Type) -> TestInit
19
- // CHECK: [[SELF_VALUE:%10]] = begin_access [modify] [static] {{.*}} : $*TestInit
20
- // CHECK-NEXT: // function_ref TestInit.point.init
40
+ // CHECK: // function_ref TestInit.point.init
21
41
// CHECK-NEXT: [[INIT_ACCESSOR:%.*]] = function_ref @$s14init_accessors8TestInitV5pointSi_Sitvi : $@convention(thin) (Int, Int, @inout Int) -> (@out Int, @out (Int, Int))
42
+ // CHECK: [[SELF_VALUE:%.*]] = begin_access [modify] [dynamic] {{.*}} : $*TestInit
22
43
// CHECK: [[Y_REF:%.*]] = struct_element_addr [[SELF_VALUE]] : $*TestInit, #TestInit.y
23
44
// CHECK-NEXT: [[FULL_REF:%.*]] = struct_element_addr [[SELF_VALUE]] : $*TestInit, #TestInit.full
24
45
// CHECK-NEXT: [[X_REF:%.*]] = struct_element_addr [[SELF_VALUE]] : $*TestInit, #TestInit.x
25
46
// CHECK-NEXT: {{.*}} = apply [[INIT_ACCESSOR]]([[Y_REF]], [[FULL_REF]], %0, %1, [[X_REF]]) : $@convention(thin) (Int, Int, @inout Int) -> (@out Int, @out (Int, Int))
47
+ // CHECK-NEXT: end_access [[SELF_VALUE]] : $*TestInit
26
48
init ( x: Int , y: Int ) {
27
49
self . x = x
28
50
self . point = ( x, y)
@@ -130,7 +152,7 @@ struct TestPartialInt {
130
152
// CHECK-NEXT: [[TWO:%.*]] = struct $Int ([[BUILTIN_TWO]] : $Builtin.Int64)
131
153
// CHECK: [[SETTER_REF:%.*]] = function_ref @$s14init_accessors14TestPartialIntV6pointYSivs : $@convention(method) (Int, @inout TestPartialInt) -> ()
132
154
// CHECK-NEXT: [[SETTER_CLOSURE:%.*]] = partial_apply [callee_guaranteed] [[SETTER_REF]]({{.*}}) : $@convention(method) (Int, @inout TestPartialInt) -> ()
133
- // CHECK-NEXT: {{.*}} = apply %32 ([[TWO]]) : $@callee_guaranteed (Int) -> ()
155
+ // CHECK-NEXT: {{.*}} = apply [[SETTER_CLOSURE]] ([[TWO]]) : $@callee_guaranteed (Int) -> ()
134
156
init ( x: Int , y: Int ) {
135
157
// Init
136
158
self . pointX = x
@@ -169,16 +191,115 @@ struct TestNoInitAndInit {
169
191
// CHECK-LABEL: sil hidden @$s14init_accessors013TestNoInitAndE0V1x1yACSi_SitcfC : $@convention(method) (Int, Int, @thin TestNoInitAndInit.Type) -> TestNoInitAndInit
170
192
//
171
193
// CHECK: [[INIT_REF:%.*]] = function_ref @$s14init_accessors013TestNoInitAndE0V6pointXSivi : $@convention(thin) (Int, @inout Int) -> ()
172
- // CHECK: [[X_REF:%.*]] = struct_element_addr {{.*}} : $*TestNoInitAndInit, #TestNoInitAndInit.x
173
- // CHECK-NEXT: %14 = apply [[INIT_REF]](%0, [[X_REF]]) : $@convention(thin) (Int, @inout Int) -> ()
194
+ // CHECK: [[SELF_REF:%.*]] = begin_access [modify] [dynamic] {{.*}} : $*TestNoInitAndInit
195
+ // CHECK-NEXT: [[X_REF:%.*]] = struct_element_addr [[SELF_REF]] : $*TestNoInitAndInit, #TestNoInitAndInit.x
196
+ // CHECK-NEXT: {{.*}} = apply [[INIT_REF]](%0, [[X_REF]]) : $@convention(thin) (Int, @inout Int) -> ()
197
+ // CHECK-NEXT: end_access [[SELF_REF]] : $*TestNoInitAndInit
174
198
//
175
199
// CHECK: [[INIT_REF:%.*]] = function_ref @$s14init_accessors013TestNoInitAndE0V6pointYSivi : $@convention(thin) (Int) -> @out Int
176
- // CHECK: [[Y_REF:%.*]] = struct_element_addr %16 : $*TestNoInitAndInit, #TestNoInitAndInit.y
177
- // CHECK-NEXT: %20 = apply [[INIT_REF]]([[Y_REF]], %1) : $@convention(thin) (Int) -> @out Int
200
+ // CHECK: [[SELF_REF:%.*]] = begin_access [modify] [dynamic] {{.*}} : $*TestNoInitAndInit
201
+ // CHECK-NEXT: [[Y_REF:%.*]] = struct_element_addr [[SELF_REF]] : $*TestNoInitAndInit, #TestNoInitAndInit.y
202
+ // CHECK-NEXT: {{.*}} = apply [[INIT_REF]]([[Y_REF]], %1) : $@convention(thin) (Int) -> @out Int
203
+ // CHECK-NEXT: end_access [[SELF_REF]] : $*TestNoInitAndInit
178
204
init ( x: Int , y: Int ) {
179
205
self . x = x
180
206
self . pointX = x
181
207
self . pointY = y
182
208
print ( " Point(x: \( self . x) , y: \( self . y) " )
183
209
}
184
210
}
211
+
212
+ class TestClass {
213
+ var x : Int
214
+ var y : ( Int , [ String ] )
215
+
216
+ var data : ( Int , ( Int , [ String ] ) ) {
217
+ // CHECK-LABEL: sil private @$s14init_accessors9TestClassC4dataSi_Si_SaySSGttvi : $@convention(thin) (Int, Int, @owned Array<String>) -> (@out Int, @out (Int, Array<String>))
218
+ // CHECK: bb0([[X_REF:%.*]] : $*Int, [[Y_REF:%.*]] : $*(Int, Array<String>), [[X_VAL:%.*]] : $Int, [[Y_VAL_0:%.*]] : $Int, [[Y_VAL_1:%.*]] : $Array<String>):
219
+ // CHECK-NEXT: [[Y_VAL_TUPLE:%.*]] = tuple ([[Y_VAL_0]] : $Int, [[Y_VAL_1]] : $Array<String>)
220
+
221
+ // CHECK: [[X_ACCESS:%.*]] = begin_access [modify] [static] [[X_REF]] : $*Int
222
+ // CHECK-NEXT: store [[X_VAL]] to [[X_ACCESS]] : $*Int
223
+ // CHECK-NEXT: end_access [[X_ACCESS]] : $*Int
224
+ //
225
+ // CHECK: [[Y_VAL_0:%.*]] = tuple_extract [[Y_VAL_TUPLE]] : $(Int, Array<String>), 0
226
+ // CHECK: [[Y_VAL_1:%.*]] = tuple_extract [[Y_VAL_TUPLE]] : $(Int, Array<String>), 1
227
+ // CHECK: [[Y_ACCESS:%.*]] = begin_access [modify] [static] [[Y_REF]] : $*(Int, Array<String>)
228
+ // CHECK-NEXT: [[Y_ELT_0:%.*]] = tuple_element_addr [[Y_ACCESS]] : $*(Int, Array<String>), 0
229
+ // CHECK-NEXT: store [[Y_VAL_0]] to [[Y_ELT_0]] : $*Int
230
+ // CHECK-NEXT: [[Y_ELT_1:%.*]] = tuple_element_addr [[Y_ACCESS]] : $*(Int, Array<String>), 1
231
+ // CHECK-NEXT: store [[Y_VAL_1]] to [[Y_ELT_1]] : $*Array<String>
232
+ // CHECK-NEXT: end_access [[Y_ACCESS]] : $*(Int, Array<String>)
233
+ init ( initialValue) initializes( x y) {
234
+ x = initialValue. 0
235
+ y = initialValue. 1
236
+ }
237
+
238
+ get { ( x, y) }
239
+ set {
240
+ x = newValue. 0
241
+ y = newValue. 1
242
+ }
243
+ }
244
+
245
+ // CHECK-LABEL: sil hidden @$s14init_accessors9TestClassC1x1yACSi_Si_SaySSGttcfc : $@convention(method) (Int, Int, @owned Array<String>, @owned TestClass) -> @owned TestClass
246
+ // CHECK: [[INIT_ACCESSOR:%.*]] = function_ref @$s14init_accessors9TestClassC4dataSi_Si_SaySSGttvi : $@convention(thin) (Int, Int, @owned Array<String>) -> (@out Int, @out (Int, Array<String>))
247
+ // CHECK: strong_retain [[SELF_REF:%.*]] : $TestClass
248
+ // CHECK: [[X_REF:%.*]] = ref_element_addr [[SELF_REF]] : $TestClass, #TestClass.x
249
+ // CHECK-NEXT: [[Y_REF:%.*]] = ref_element_addr [[SELF_REF]] : $TestClass, #TestClass.y
250
+ // CHECK-NEXT: [[Y_VAL_0:%.*]] = tuple_extract %12 : $(Int, Array<String>), 0
251
+ // CHECK-NEXT: [[Y_VAL_1:%.*]] = tuple_extract %12 : $(Int, Array<String>), 1
252
+ // CHECK-NEXT: {{.*}} = apply [[INIT_ACCESSOR]]([[X_REF]], [[Y_REF]], %0, [[Y_VAL_0]], [[Y_VAL_1]]) : $@convention(thin) (Int, Int, @owned Array<String>) -> (@out Int, @out (Int, Array<String>))
253
+ // CHECK-NEXT: strong_release [[SELF_REF]] : $TestClass
254
+ init ( x: Int , y: ( Int , [ String ] ) ) {
255
+ self . data = ( x, y)
256
+ }
257
+ }
258
+
259
+ struct TestGeneric < T, U> {
260
+ var a : T
261
+ var b : T
262
+ var c : U
263
+
264
+ // CHECK-LABEL: sil private @$s14init_accessors11TestGenericV4datax_xtvi : $@convention(thin) <T, U> (@in T, @in T, @inout U) -> (@out T, @out T)
265
+ //
266
+ // CHECK: bb0([[A_REF:%.*]] : $*T, [[B_REF:%.*]] : $*T, [[A_VALUE:%.*]] : $*T, [[B_VALUE:%.*]] : $*T, [[C_REF:%.*]] : $*U):
267
+ //
268
+ // CHECK: [[A_ACCESS:%.*]] = begin_access [modify] [static] [[A_REF]] : $*T
269
+ // CHECK-NEXT: copy_addr [take] {{.*}} to [init] [[A_ACCESS]] : $*T
270
+ // CHECK-NEXT: end_access [[A_ACCESS]] : $*T
271
+ //
272
+ // CHECK: [[B_ACCESS:%.*]] = begin_access [modify] [static] [[B_REF]] : $*T
273
+ // CHECK-NEXT: copy_addr [take] {{.*}} to [init] [[B_ACCESS]] : $*T
274
+ // CHECK-NEXT: end_access [[B_ACCESS]] : $*T
275
+ //
276
+ // CHECK: [[C_ACCESS:%.*]] = begin_access [read] [static] [[C_REF]] : $*U
277
+ // CHECK-NEXT: [[C_AS_ANY:%.*]] = init_existential_addr {{.*}} : $*Any, $U
278
+ // CHECK-NEXT: copy_addr [[C_ACCESS]] to [init] [[C_AS_ANY]] : $*U
279
+ // CHECK-NEXT: end_access [[C_ACCESS]] : $*U
280
+ var data : ( T , T ) {
281
+ init ( initialValue) initializes( a b) accesses( c) {
282
+ a = initialValue. 0
283
+ b = initialValue. 1
284
+ print ( c)
285
+ }
286
+
287
+ get { ( a, b) }
288
+ set { }
289
+ }
290
+
291
+ // CHECK-LABEL: sil hidden @$s14init_accessors11TestGenericV1a1b1cACyxq_Gx_xq_tcfC : $@convention(method) <T, U> (@in T, @in T, @in U, @thin TestGeneric<T, U>.Type) -> @out TestGeneric<T, U>
292
+ //
293
+ // CHECK: [[INIT_ACCESSOR:%.*]] = function_ref @$s14init_accessors11TestGenericV4datax_xtvi : $@convention(thin) <τ_0_0, τ_0_1> (@in τ_0_0, @in τ_0_0, @inout τ_0_1) -> (@out τ_0_0, @out τ_0_0)
294
+ // CHECK: {{.*}} = apply [[INIT_ACCESSOR]]<T, U>({{.*}}) : $@convention(thin) <τ_0_0, τ_0_1> (@in τ_0_0, @in τ_0_0, @inout τ_0_1) -> (@out τ_0_0, @out τ_0_0)
295
+ //
296
+ // CHECK: [[SETTER:%.*]] = function_ref @$s14init_accessors11TestGenericV4datax_xtvs : $@convention(method) <τ_0_0, τ_0_1> (@in τ_0_0, @in τ_0_0, @inout TestGeneric<τ_0_0, τ_0_1>) -> ()
297
+ // CHECK-NEXT: [[SETTER_CLOSURE:%.*]] = partial_apply [callee_guaranteed] [[SETTER]]<T, U>([[SELF_VALUE:%.*]]) : $@convention(method) <τ_0_0, τ_0_1> (@in τ_0_0, @in τ_0_0, @inout TestGeneric<τ_0_0, τ_0_1>) -> ()
298
+ // CHECK: %55 = apply [[SETTER_CLOSURE]]({{.*}}) : $@callee_guaranteed (@in T, @in T) -> ()
299
+ // CHECK-NEXT: end_access [[SELF_VALUE]] : $*TestGeneric<T, U>
300
+ init ( a: T , b: T , c: U ) {
301
+ self . c = c
302
+ self . data = ( a, b)
303
+ self . data = ( b, a)
304
+ }
305
+ }
0 commit comments