|
| 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