@@ -40,11 +40,15 @@ public class C2: C1 {
40
40
41
41
public struct T {
42
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)
43
+ public let b: (f: String, g: Int)
46
44
}
47
45
46
+ public struct TG<T, U, V> {
47
+ public var a: (T, U, V)
48
+ }
49
+
50
+ typealias TGA<T, U> = (a: T, b: U)
51
+
48
52
sil_vtable C {}
49
53
sil_vtable C1 {}
50
54
sil_vtable C2 {}
@@ -200,41 +204,13 @@ sil_vtable C2 {}
200
204
// -- tuple element #0 of T.a
201
205
// CHECK-SAME: <i32 0x0180_0000> }>
202
206
203
- // -- %t1: T.a.1
207
+ // -- %t1: T.b.g
204
208
// CHECK: [[KP_T1:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
205
209
// CHECK-SAME: [[WORD]]* @keypath_once
206
210
// CHECK-SAME: @"symbolic
207
211
// CHECK-SAME: @"symbolic
208
212
// -- instantiable in-line, size 12
209
213
// 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
214
// -- offset of T.b
239
215
// CHECK-32-SAME: <i32 0x0100_000c>,
240
216
// CHECK-64-SAME: <i32 0x0100_0018>,
@@ -243,65 +219,6 @@ sil_vtable C2 {}
243
219
// CHECK-32-SAME: <i32 0x0180_0008> }>
244
220
// CHECK-64-SAME: <i32 0x0180_0010> }>
245
221
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
-
305
222
// -- %i: Gen<A>.x
306
223
// CHECK: [[KP_I:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
307
224
// CHECK-SAME: i32 0
@@ -328,6 +245,49 @@ sil_vtable C2 {}
328
245
// CHECK-32-SAME: i32 20 }>
329
246
// CHECK-64-SAME: i32 36 }>
330
247
248
+ // -- %tg0: TG<T,U,V>.a.0
249
+ // CHECK: [[KP_TG0:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
250
+ // CHECK-SAME: @"generic environment r1_l"
251
+ // CHECK-SAME: @"symbolic
252
+ // CHECK-SAME: @"symbolic
253
+ // -- struct with runtime-resolved offset, mutable
254
+ // CHECK-SAME: <i32 0x01ff_fffe>,
255
+ // -- offset of TG.a
256
+ // CHECK-32-SAME: i32 20
257
+ // CHECK-64-SAME: i32 40
258
+ // CHECK-SAME: @"symbolic
259
+ // -- tuple element with compile-time known offset, mutable
260
+ // -- tuple element #0 of TG.a
261
+ // CHECK-SAME: <i32 0x0180_0000> }>
262
+
263
+ // -- %tg1: TG<T,U,V>.a.2
264
+ // CHECK: [[KP_TG1:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
265
+ // CHECK-SAME: @"generic environment r1_l"
266
+ // CHECK-SAME: @"symbolic
267
+ // CHECK-SAME: @"symbolic
268
+ // -- struct with runtime-resolved offset, mutable
269
+ // CHECK-SAME: <i32 0x01ff_fffe>,
270
+ // -- offset of TG.a
271
+ // CHECK-32-SAME: i32 20
272
+ // CHECK-64-SAME: i32 40
273
+ // CHECK-SAME: @"symbolic
274
+ // -- tuple element with runtime-resolved offset, mutable
275
+ // CHECK-SAME: <i32 0x01ff_fffe>,
276
+ // -- tuple element #2 of TG.a
277
+ // CHECK-32-SAME: i32 32 }>
278
+ // CHECK-64-SAME: i32 64 }>
279
+
280
+ // -- %tg2: TGA<T,U>.1
281
+ // CHECK: [[KP_TG2:@keypath(\..*)?]] = private global <{ {{.*}} }> <{
282
+ // CHECK-SAME: @"generic environment r0_l"
283
+ // CHECK-SAME: @"symbolic
284
+ // CHECK-SAME: @"symbolic
285
+ // -- tuple element with runtime-resolved offset, mutable
286
+ // CHECK-SAME: <i32 0x01ff_fffe>,
287
+ // -- tuple element #1 of TGA
288
+ // CHECK-32-SAME: i32 24 }>
289
+ // CHECK-64-SAME: i32 48 }>
290
+
331
291
// CHECK-LABEL: @"generic environment SHRzSHR_r0_l" = linkonce_odr hidden constant
332
292
// CHECK-SAME: i32 8193, i16 2, i8 -128, i8 -128, i32 128
333
293
@@ -360,23 +320,9 @@ entry:
360
320
361
321
// CHECK: call %swift.refcounted* @swift_getKeyPath(i8* bitcast ({{.*}} [[KP_T0]] to i8*), i8* undef)
362
322
%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
323
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)
324
+ // CHECK: call %swift.refcounted* @swift_getKeyPath(i8* bitcast ({{.*}} [[KP_T1]] to i8*), i8* undef)
325
+ %t1 = keypath $KeyPath<T, Int>, (root $T; stored_property #T.b : $(f: String, g: Int); tuple_element #1 : $Int)
380
326
381
327
return undef : $()
382
328
}
@@ -442,6 +388,27 @@ entry:
442
388
return undef : $()
443
389
}
444
390
391
+ // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @tuple_generics(%swift.type* %T, %swift.type* %U, %swift.type* %V)
392
+ sil @tuple_generics : $@convention(thin) <T, U, V> () -> () {
393
+ entry:
394
+ // CHECK: [[PTR:%.*]] = bitcast i8* [[ARGS:%.*]] to
395
+ // CHECK: store %swift.type* %T, %swift.type** [[PTR]]
396
+ // CHECK: call %swift.refcounted* @swift_getKeyPath(i8* bitcast ({{.*}} [[KP_TG0]] to i8*), i8* [[ARGS]])
397
+ %tg0 = keypath $KeyPath<TG<T,U,V>, T>, <A,B,C> (root $TG<A,B,C>; stored_property #TG.a : $(A,B,C); tuple_element #0 : $A) <T,U,V>
398
+
399
+ // CHECK: [[PTR:%.*]] = bitcast i8* [[ARGS:%.*]] to
400
+ // CHECK: store %swift.type* %T, %swift.type** [[PTR]]
401
+ // CHECK: call %swift.refcounted* @swift_getKeyPath(i8* bitcast ({{.*}} [[KP_TG1]] to i8*), i8* [[ARGS]])
402
+ %tg1 = keypath $KeyPath<TG<T,U,V>, V>, <A,B,C> (root $TG<A,B,C>; stored_property #TG.a : $(A,B,C); tuple_element #2 : $C) <T,U,V>
403
+
404
+ // CHECK: [[PTR:%.*]] = bitcast i8* [[ARGS:%.*]] to
405
+ // CHECK: store %swift.type* %T, %swift.type** [[PTR]]
406
+ // CHECK: call %swift.refcounted* @swift_getKeyPath(i8* bitcast ({{.*}} [[KP_TG2]] to i8*), i8* [[ARGS]])
407
+ %tg2 = keypath $KeyPath<TGA<T,U>, U>, <A,B> (root $TGA<A,B>; tuple_element #1 : $B) <T,U>
408
+
409
+ return undef : $()
410
+ }
411
+
445
412
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @computed_property_generics
446
413
sil @computed_property_generics : $@convention(thin) <T, U> () -> () {
447
414
entry:
0 commit comments