@@ -165,3 +165,40 @@ func wrapTupleElements<each T>(_ value: repeat each T) -> (repeat Wrapper<each T
165165 // CHECK-NEXT: [[RET:%.*]] = tuple ()
166166 // CHECK-NEXT: return [[RET]] : $()
167167}
168+
169+ // CHECK-LABEL: sil hidden [ossa] @$s4main20projectTupleElementsyyAA7WrapperVyxGxQpRvzlF : $@convention(thin) <each T> (@pack_guaranteed Pack{repeat Wrapper<each T>}) -> () {
170+ func projectTupleElements< each T > ( _ value: repeat Wrapper < each T > ) {
171+ // CHECK: [[VAR:%.*]] = alloc_stack [lexical] $(repeat each T)
172+
173+ // CHECK-NEXT: [[ZERO:%.*]] = integer_literal $Builtin.Word, 0
174+ // CHECK-NEXT: [[ONE:%.*]] = integer_literal $Builtin.Word, 1
175+ // CHECK-NEXT: [[PACK_LEN:%.*]] = pack_length $Pack{repeat each T}
176+
177+ // CHECK-NEXT: br bb1([[ZERO]] : $Builtin.Word)
178+
179+ // CHECK: bb1([[INDEX:%.*]] : $Builtin.Word):
180+ // CHECK-NEXT: [[INDEX_EQ_LEN:%.*]] = builtin "cmp_eq_Word"([[INDEX]] : $Builtin.Word, [[PACK_LEN]] : $Builtin.Word)
181+ // CHECK-NEXT: cond_br [[INDEX_EQ_LEN]], bb3, bb2
182+
183+ // CHECK: bb2:
184+ // CHECK-NEXT: [[CUR_INDEX:%.*]] = dynamic_pack_index [[INDEX]] of $Pack{repeat each T}
185+ // CHECK-NEXT: open_pack_element [[CUR_INDEX]] of <each T> at <Pack{repeat each T}>, shape $T, uuid "[[UUID:[0-9A-F-]*]]"
186+ // CHECK-NEXT: [[TUPLE_ELT_ADDR:%.*]] = tuple_pack_element_addr [[CUR_INDEX]] of [[VAR]] : $*(repeat each T) as $*@pack_element("[[UUID]]") T
187+ // CHECK-NEXT: [[VAL_ELT_ADDR:%.*]] = pack_element_get [[CUR_INDEX]] of %0 : $*Pack{repeat Wrapper<each T>} as $*Wrapper<@pack_element("[[UUID]]") T>
188+ // CHECK-NEXT: [[TEMP:%.*]] = alloc_stack $Wrapper<@pack_element("[[UUID]]") T>
189+ // CHECK-NEXT: copy_addr [[VAL_ELT_ADDR]] to [init] [[TEMP]] : $*Wrapper<@pack_element("[[UUID]]") T>
190+ // CHECK-NEXT: [[MEMBER:%.*]] = struct_element_addr [[TEMP]] : $*Wrapper<@pack_element("[[UUID]]") T>, #Wrapper.value
191+ // CHECK-NEXT: copy_addr [[MEMBER]] to [init] [[TUPLE_ELT_ADDR]] : $*@pack_element("[[UUID]]") T
192+ // CHECK-NEXT: destroy_addr [[TEMP]] : $*Wrapper<@pack_element("[[UUID]]") T>
193+ // CHECK-NEXT: dealloc_stack [[TEMP]] : $*Wrapper<@pack_element("[[UUID]]") T>
194+ // CHECK-NEXT: [[NEXT_INDEX:%.*]] = builtin "add_Word"([[INDEX]] : $Builtin.Word, [[ONE]] : $Builtin.Word) : $Builtin.Word
195+ // CHECK-NEXT: br bb1([[NEXT_INDEX]] : $Builtin.Word)
196+
197+ // CHECK: bb3:
198+ // CHECK-NEXT: destroy_addr [[VAR]] : $*(repeat each T)
199+ // CHECK-NEXT: dealloc_stack [[VAR]] : $*(repeat each T)
200+ // CHECK-NEXT: [[RET:%.*]] = tuple ()
201+ // CHECK-NEXT: return [[RET]] : $()
202+
203+ let tuple = ( repeat ( each value) . value)
204+ }
0 commit comments