@@ -112,3 +112,56 @@ public struct Container<each T> {
112112// CHECK-NEXT: return [[RET]] : $()
113113
114114// CHECK-LABEL: sil {{.*}}@$s4main9ContainerV7storageAA6StoredVyxGxQp_tvM
115+
116+ struct Wrapper < Value> {
117+ let value : Value
118+ }
119+
120+ // CHECK-LABEL: @$s4main17wrapTupleElementsyAA7WrapperVyxGxQp_txxQpRvzlF : $@convention(thin) <each T> (@pack_guaranteed Pack{repeat each T}) -> @pack_out Pack{repeat Wrapper<each T>}
121+ func wrapTupleElements< each T > ( _ value: repeat each T ) -> ( repeat Wrapper < each T > ) {
122+ // CHECK: [[RETURN_VAL:%.*]] : $*Pack{repeat Wrapper<each T>}
123+
124+ // CHECK: [[VAR:%.*]] = alloc_stack [lexical] $(repeat each T)
125+ let values = ( repeat each value)
126+
127+ // Create a temporary for the 'values' in 'each values.element'
128+ // CHECK: bb3:
129+ // CHECK-NEXT: [[TEMP:%.*]] = alloc_stack $(repeat each T)
130+ // CHECK-NEXT: copy_addr [[VAR]] to [init] [[TEMP]] : $*(repeat each T)
131+
132+ // Integer values for dynamic pack loop
133+ // CHECK-NEXT: [[ZERO:%.*]] = integer_literal $Builtin.Word, 0
134+ // CHECK-NEXT: [[ONE:%.*]] = integer_literal $Builtin.Word, 1
135+ // CHECK-NEXT: [[PACK_LEN:%.*]] = pack_length $Pack{repeat each T}
136+ // CHECK-NEXT: br bb4([[ZERO]] : $Builtin.Word)
137+
138+ // Loop condition
139+ // CHECK: bb4([[INDEX:%.*]] : $Builtin.Word)
140+ // CHECK-NEXT: [[INDEX_EQ_LEN:%.*]] = builtin "cmp_eq_Word"([[INDEX]] : $Builtin.Word, [[PACK_LEN]] : $Builtin.Word) : $Builtin.Int1
141+ // CHECK-NEXT: cond_br [[INDEX_EQ_LEN]], bb6, bb5
142+
143+ // Loop body
144+ // CHECK: bb5:
145+ // CHECK-NEXT: [[CUR_INDEX:%.*]] = dynamic_pack_index [[INDEX]] of $Pack{repeat Wrapper<each T>}
146+ // CHECK-NEXT: open_pack_element [[CUR_INDEX]] of <each T> at <Pack{repeat each T}>, shape $T, uuid [[UUID:".*"]]
147+ // CHECK-NEXT: [[RETURN_VAL_ELT_ADDR:%.*]] = pack_element_get [[CUR_INDEX]] of [[RETURN_VAL]] : $*Pack{repeat Wrapper<each T>} as $*Wrapper<@pack_element([[UUID]]) T>
148+ // CHECK-NEXT: [[METATYPE:%.*]] = metatype $@thin Wrapper<@pack_element([[UUID]]) T>.Type
149+ // CHECK-NEXT: [[TUPLE_ELT_ADDR:%.*]] = tuple_pack_element_addr [[CUR_INDEX]] of [[TEMP]] : $*(repeat each T) as $*@pack_element([[UUID]]) T
150+ // CHECK-NEXT: [[INIT_ARG:%.*]] = alloc_stack $@pack_element([[UUID]]) T
151+ // CHECK-NEXT: copy_addr [[TUPLE_ELT_ADDR]] to [init] [[INIT_ARG]] : $*@pack_element([[UUID]]) T
152+ // function_ref Wrapper.init(value:)
153+ // CHECK: [[INIT:%.*]] = function_ref @$s4main7WrapperV5valueACyxGx_tcfC : $@convention(method) <τ_0_0> (@in τ_0_0, @thin Wrapper<τ_0_0>.Type) -> @out Wrapper<τ_0_0>
154+ // CHECK-NEXT: apply [[INIT]]<@pack_element([[UUID]]) T>([[RETURN_VAL_ELT_ADDR]], [[INIT_ARG]], [[METATYPE]]) : $@convention(method) <τ_0_0> (@in τ_0_0, @thin Wrapper<τ_0_0>.Type) -> @out Wrapper<τ_0_0>
155+ // CHECK-NEXT: dealloc_stack [[INIT_ARG]] : $*@pack_element([[UUID]]) T
156+ // CHECK-NEXT: [[NEXT_INDEX:%.*]] = builtin "add_Word"([[INDEX]] : $Builtin.Word, [[ONE]] : $Builtin.Word) : $Builtin.Word
157+ // CHECK-NEXT: br bb4([[NEXT_INDEX]] : $Builtin.Word)
158+
159+ return ( repeat Wrapper( value: each values. element) )
160+
161+ // CHECK: destroy_addr [[TEMP]] : $*(repeat each T)
162+ // CHECK: dealloc_stack [[TEMP]] : $*(repeat each T)
163+ // CHECK: destroy_addr [[VAR]] : $*(repeat each T)
164+ // CHECK: dealloc_stack [[VAR]] : $*(repeat each T)
165+ // CHECK-NEXT: [[RET:%.*]] = tuple ()
166+ // CHECK-NEXT: return [[RET]] : $()
167+ }
0 commit comments