Skip to content

Commit db0ecb3

Browse files
committed
Tests for the vanishing tuples work in this PR.
Fixes rdar://107459964 and rdar://107478603.
1 parent 552ad07 commit db0ecb3

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// RUN: %target-swift-emit-silgen -enable-experimental-feature VariadicGenerics %s | %FileCheck %s
2+
3+
// rdar://107459964
4+
// rdar://107478603
5+
6+
// Because of -enable-experimental-feature VariadicGenerics
7+
// REQUIRES: asserts
8+
9+
public struct G<Value> {
10+
public let id: Int
11+
}
12+
13+
public struct Holder<each T> {
14+
public let values: (repeat G<each T>)
15+
}
16+
17+
// CHECK-LABEL: sil {{.*}}@$s4main21testInstanceVarAccessyAA1GVyxGAA6HolderVyx_QPGlF :
18+
// CHECK: [[T0:%.*]] = struct_extract %0 : $Holder<X>, #Holder.values
19+
// CHECK-NEXT: return [[T0]] : $G<X>
20+
public func testInstanceVarAccess<X>(_ holder: Holder<X>) -> G<X> {
21+
return holder.values
22+
}
23+
24+
extension Holder {
25+
public static var allValues: (repeat G<each T>) {
26+
return (repeat G<each T>(id: 0))
27+
}
28+
}
29+
30+
// CHECK-LABEL: sil {{.*}}@$s4main19testStaticVarAccessAA1GVyxGylF :
31+
// CHECK: [[METATYPE:%.*]] = metatype $@thin Holder<X>.Type
32+
// CHECK-NEXT: [[PACK:%.*]] = alloc_pack $Pack{G<X>}
33+
// CHECK-NEXT: [[TEMP:%.*]] = alloc_stack $G<X>
34+
// CHECK-NEXT: [[INDEX:%.*]] = scalar_pack_index 0 of $Pack{G<X>}
35+
// CHECK-NEXT: pack_element_set [[TEMP]] : $*G<X> into [[INDEX]] of [[PACK]] :
36+
// CHECK-NEXT: // function_ref
37+
// CHECK-NEXT: [[FN:%.*]] = function_ref @$s4main6HolderV9allValuesAA1GVyxGxQp_tvgZ : $@convention(method) <each τ_0_0> (@thin Holder<repeat each τ_0_0>.Type) -> @pack_out Pack{repeat G<each τ_0_0>}
38+
// CHECK-NEXT: apply [[FN]]<Pack{X}>([[PACK]], [[METATYPE]])
39+
// CHECK-NEXT: [[T0:%.*]] = load [trivial] [[TEMP]] : $*G<X>
40+
// CHECK-NEXT: dealloc_stack [[TEMP]]
41+
// CHECK-NEXT: dealloc_pack [[PACK]]
42+
// CHECK-NEXT: return [[T0]] : $G<X>
43+
public func testStaticVarAccess<X>() -> G<X> {
44+
return Holder<X>.allValues
45+
}
46+
47+
extension Holder {
48+
static func takeExpansion(arg: (repeat G<each T>)) {}
49+
static func takePartial(arg: (Int, repeat G<each T>)) {}
50+
}
51+
52+
// CHECK-LABEL: sil {{.*}}@$s4main23testArgPassingExpansion3argyAA1GVyxG_tlF :
53+
// CHECK: [[METATYPE:%.*]] = metatype $@thin Holder<X>.Type
54+
// CHECK-NEXT: [[PACK:%.*]] = alloc_pack $Pack{G<X>}
55+
// CHECK-NEXT: [[TEMP:%.*]] = alloc_stack $G<X>
56+
// CHECK-NEXT: store %0 to [trivial] [[TEMP]] : $*G<X>
57+
// CHECK-NEXT: [[INDEX:%.*]] = scalar_pack_index 0 of $Pack{G<X>}
58+
// CHECK-NEXT: pack_element_set [[TEMP]] : $*G<X> into [[INDEX]] of [[PACK]] :
59+
// CHECK-NEXT: // function_ref
60+
// CHECK-NEXT: [[FN:%.*]] = function_ref @$s4main6HolderV13takeExpansion3argyAA1GVyxGxQp_t_tFZ : $@convention(method) <each τ_0_0> (@pack_guaranteed Pack{repeat G<each τ_0_0>}, @thin Holder<repeat each τ_0_0>.Type) -> ()
61+
// CHECK-NEXT: apply [[FN]]<Pack{X}>([[PACK]], [[METATYPE]])
62+
// CHECK-NEXT: dealloc_stack [[TEMP]]
63+
// CHECK-NEXT: dealloc_pack [[PACK]]
64+
public func testArgPassingExpansion<X>(arg: G<X>) {
65+
Holder<X>.takeExpansion(arg: arg)
66+
}
67+
68+
// CHECK-LABEL: sil {{.*}}@$s4main21testArgPassingPartialyyF :
69+
// CHECK: [[METATYPE:%.*]] = metatype $@thin Holder<>.Type
70+
// CHECK: [[PACK:%.*]] = alloc_pack $Pack{}
71+
// CHECK-NEXT: // function_ref
72+
// CHECK-NEXT: [[FN:%.*]] = function_ref @$s4main6HolderV11takePartial3argySi_AA1GVyxGxQpt_tFZ : $@convention(method) <each τ_0_0> (Int, @pack_guaranteed Pack{repeat G<each τ_0_0>}, @thin Holder<repeat each τ_0_0>.Type) -> ()
73+
// CHECK-NEXT: apply [[FN]]<Pack{}>({{.*}}, [[PACK]], [[METATYPE]])
74+
// CHECK-NEXT: dealloc_pack [[PACK]]
75+
public func testArgPassingPartial() {
76+
Holder< >.takePartial(arg: 0)
77+
}

0 commit comments

Comments
 (0)