@@ -38,6 +38,13 @@ public class C2: C1 {
38
38
public var reabstracted: () -> ()
39
39
}
40
40
41
+ public struct T {
42
+ public var a: (Int, String)
43
+ public let b: (String, Int)
44
+ public var c: (f: Int, g: String)
45
+ public let d: (x: String, y: Int)
46
+ }
47
+
41
48
sil_vtable C {}
42
49
sil_vtable C1 {}
43
50
sil_vtable C2 {}
@@ -180,6 +187,121 @@ sil_vtable C2 {}
180
187
// looping in the compiler at one point.
181
188
// CHECK: [[KP_M:@keypath.*]] = private global <{ {{.*}} }> <{
182
189
190
+ // -- %t0: T.a.0
191
+ // CHECK: [[KP_T0:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
192
+ // CHECK-SAME: [[WORD]]* @keypath_once
193
+ // CHECK-SAME: @"symbolic
194
+ // CHECK-SAME: @"symbolic
195
+ // -- instantiable in-line, size 12
196
+ // CHECK-SAME: <i32 0x8000_000c>,
197
+ // -- offset of T.a, mutable
198
+ // CHECK-SAME: <i32 0x0180_0000>,
199
+ // CHECK: @"symbolic
200
+ // -- tuple element #0 of T.a
201
+ // CHECK-SAME: <i32 0x0180_0000> }>
202
+
203
+ // -- %t1: T.a.1
204
+ // CHECK: [[KP_T1:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
205
+ // CHECK-SAME: [[WORD]]* @keypath_once
206
+ // CHECK-SAME: @"symbolic
207
+ // CHECK-SAME: @"symbolic
208
+ // -- instantiable in-line, size 12
209
+ // CHECK-SAME: <i32 0x8000_000c>,
210
+ // -- offset of T.a, mutable
211
+ // CHECK-SAME: <i32 0x0180_0000>,
212
+ // CHECK: @"symbolic
213
+ // -- tuple element #1 of T.a
214
+ // CHECK-32-SAME: <i32 0x0180_0004> }>
215
+ // CHECK-64-SAME: <i32 0x0180_0008> }>
216
+
217
+ // -- %t2: T.b.0
218
+ // CHECK: [[KP_T2:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
219
+ // CHECK-SAME: [[WORD]]* @keypath_once
220
+ // CHECK-SAME: @"symbolic
221
+ // CHECK-SAME: @"symbolic
222
+ // -- instantiable in-line, size 12
223
+ // CHECK-SAME: <i32 0x8000_000c>,
224
+ // -- offset of T.b
225
+ // CHECK-32-SAME: <i32 0x0100_000c>,
226
+ // CHECK-64-SAME: <i32 0x0100_0018>,
227
+ // CHECK: @"symbolic
228
+ // -- tuple element #0 of T.b
229
+ // CHECK-SAME: <i32 0x0180_0000> }>
230
+
231
+ // -- %t3: T.b.1
232
+ // CHECK: [[KP_T3:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
233
+ // CHECK-SAME: [[WORD]]* @keypath_once
234
+ // CHECK-SAME: @"symbolic
235
+ // CHECK-SAME: @"symbolic
236
+ // -- instantiable in-line, size 12
237
+ // CHECK-SAME: <i32 0x8000_000c>,
238
+ // -- offset of T.b
239
+ // CHECK-32-SAME: <i32 0x0100_000c>,
240
+ // CHECK-64-SAME: <i32 0x0100_0018>,
241
+ // CHECK: @"symbolic
242
+ // -- tuple element #1 of T.b
243
+ // CHECK-32-SAME: <i32 0x0180_0008> }>
244
+ // CHECK-64-SAME: <i32 0x0180_0010> }>
245
+
246
+ // -- %t4: T.c.f
247
+ // CHECK: [[KP_T4:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
248
+ // CHECK-SAME: [[WORD]]* @keypath_once
249
+ // CHECK-SAME: @"symbolic
250
+ // CHECK-SAME: @"symbolic
251
+ // -- instantiable in-line, size 12
252
+ // CHECK-SAME: <i32 0x8000_000c>,
253
+ // -- offset of T.f, mutable
254
+ // CHECK-32-SAME: <i32 0x0180_0018>,
255
+ // CHECK-64-SAME: <i32 0x0180_0030>,
256
+ // CHECK: @"symbolic
257
+ // -- tuple element #0 of T.f
258
+ // CHECK-SAME: <i32 0x0180_0000> }>
259
+
260
+ // -- %t5: T.c.g
261
+ // CHECK: [[KP_T5:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
262
+ // CHECK-SAME: [[WORD]]* @keypath_once
263
+ // CHECK-SAME: @"symbolic
264
+ // CHECK-SAME: @"symbolic
265
+ // -- instantiable in-line, size 12
266
+ // CHECK-SAME: <i32 0x8000_000c>,
267
+ // -- offset of T.f, mutable
268
+ // CHECK-32-SAME: <i32 0x0180_0018>,
269
+ // CHECK-64-SAME: <i32 0x0180_0030>,
270
+ // CHECK: @"symbolic
271
+ // -- tuple element #1 of T.f
272
+ // CHECK-32-SAME: <i32 0x0180_0004> }>
273
+ // CHECK-64-SAME: <i32 0x0180_0008> }>
274
+
275
+ // -- %t6: T.d.x
276
+ // CHECK: [[KP_T6:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
277
+ // CHECK-SAME: [[WORD]]* @keypath_once
278
+ // CHECK-SAME: @"symbolic
279
+ // CHECK-SAME: @"symbolic
280
+ // -- instantiable in-line, size 12
281
+ // CHECK-SAME: <i32 0x8000_000c>,
282
+ // -- offset of T.d
283
+ // CHECK-32-SAME: <i32 0x0100_0024>,
284
+ // CHECK-64-SAME: <i32 0x0100_0048>,
285
+ // CHECK: @"symbolic
286
+ // -- tuple element #0 of T.d
287
+ // CHECK-32-SAME: <i32 0x0180_0000> }>
288
+ // CHECK-64-SAME: <i32 0x0180_0000> }>
289
+
290
+ // -- %t7: T.d.y
291
+ // CHECK: [[KP_T7:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
292
+ // CHECK-SAME: [[WORD]]* @keypath_once
293
+ // CHECK-SAME: @"symbolic
294
+ // CHECK-SAME: @"symbolic
295
+ // -- instantiable in-line, size 12
296
+ // CHECK-SAME: <i32 0x8000_000c>,
297
+ // -- offset of T.d
298
+ // CHECK-32-SAME: <i32 0x0100_0024>,
299
+ // CHECK-64-SAME: <i32 0x0100_0048>,
300
+ // CHECK: @"symbolic
301
+ // -- tuple element #0 of T.d
302
+ // CHECK-32-SAME: <i32 0x0180_0008> }>
303
+ // CHECK-64-SAME: <i32 0x0180_0010> }>
304
+
183
305
// -- %i: Gen<A>.x
184
306
// CHECK: [[KP_I:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
185
307
// CHECK-SAME: i32 0
@@ -236,6 +358,26 @@ entry:
236
358
%m = keypath $KeyPath<S, () -> ()>, (root $S; settable_property $() -> (), id ##S.reabstracted, getter @m_get : $@convention(thin) (@in_guaranteed S) -> @out @callee_guaranteed () -> @out (), setter @m_set : $@convention(thin) (@in_guaranteed @callee_guaranteed () -> @out (), @inout S) -> ())
237
359
%m2 = keypath $KeyPath<C2, () -> ()>, (root $C2; settable_property $() -> (), id ##C2.reabstracted, getter @m2_get : $@convention(thin) (@in_guaranteed C2) -> @out @callee_guaranteed () -> @out (), setter @m2_set : $@convention(thin) (@in_guaranteed @callee_guaranteed () -> @out (), @inout C2) -> ())
238
360
361
+ // CHECK: call %swift.refcounted* @swift_getKeyPath(i8* bitcast ({{.*}} [[KP_T0]] to i8*), i8* undef)
362
+ %t0 = keypath $KeyPath<T, Int>, (root $T; stored_property #T.a : $(Int, String); tuple_element #0 : $Int)
363
+ // CHECK: call %swift.refcounted* @swift_getKeyPath(i8* bitcast ({{.*}} [[KP_T1]] to i8*), i8* undef)
364
+ %t1 = keypath $KeyPath<T, String>, (root $T; stored_property #T.a : $(Int, String); tuple_element #1 : $String)
365
+
366
+ // CHECK: call %swift.refcounted* @swift_getKeyPath(i8* bitcast ({{.*}} [[KP_T2]] to i8*), i8* undef)
367
+ %t2 = keypath $KeyPath<T, String>, (root $T; stored_property #T.b : $(String, Int); tuple_element #0 : $String)
368
+ // CHECK: call %swift.refcounted* @swift_getKeyPath(i8* bitcast ({{.*}} [[KP_T3]] to i8*), i8* undef)
369
+ %t3 = keypath $KeyPath<T, Int>, (root $T; stored_property #T.b : $(String, Int); tuple_element #1 : $Int)
370
+
371
+ // CHECK: call %swift.refcounted* @swift_getKeyPath(i8* bitcast ({{.*}} [[KP_T4]] to i8*), i8* undef)
372
+ %t4 = keypath $KeyPath<T, Int>, (root $T; stored_property #T.c : $(f: Int, g: String); tuple_element #0 : $Int)
373
+ // CHECK: call %swift.refcounted* @swift_getKeyPath(i8* bitcast ({{.*}} [[KP_T5]] to i8*), i8* undef)
374
+ %t5 = keypath $KeyPath<T, String>, (root $T; stored_property #T.c : $(f: Int, g: String); tuple_element #1 : $String)
375
+
376
+ // CHECK: call %swift.refcounted* @swift_getKeyPath(i8* bitcast ({{.*}} [[KP_T6]] to i8*), i8* undef)
377
+ %t6 = keypath $KeyPath<T, String>, (root $T; stored_property #T.d : $(x: String, y: Int); tuple_element #0 : $String)
378
+ // CHECK: call %swift.refcounted* @swift_getKeyPath(i8* bitcast ({{.*}} [[KP_T7]] to i8*), i8* undef)
379
+ %t7 = keypath $KeyPath<T, Int>, (root $T; stored_property #T.d : $(x: String, y: Int); tuple_element #1 : $Int)
380
+
239
381
return undef : $()
240
382
}
241
383
0 commit comments