Skip to content

Commit 3266a82

Browse files
committed
SIL: Unwrap reference to value parameter packs in TypeConverter::getAbstractionPattern()
1 parent c0570d5 commit 3266a82

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

lib/SIL/IR/AbstractionPattern.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,12 @@ TypeConverter::getAbstractionPattern(VarDecl *var, bool isNonObjC) {
7979
auto sig = var->getDeclContext()
8080
->getGenericSignatureOfContext()
8181
.getCanonicalSignature();
82-
auto swiftType = sig.getReducedType(var->getInterfaceType());
82+
83+
auto interfaceType = var->getInterfaceType();
84+
if (auto *packExpansionType = interfaceType->getAs<PackExpansionType>())
85+
interfaceType = packExpansionType->getPatternType();
86+
87+
auto swiftType = sig.getReducedType(interfaceType);
8388

8489
if (isNonObjC)
8590
return AbstractionPattern(sig, swiftType);

test/SILGen/variadic-generic-tuples.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)