@@ -112,3 +112,56 @@ public struct Container<each T> {
112
112
// CHECK-NEXT: return [[RET]] : $()
113
113
114
114
// 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