Skip to content

Commit fdd3aa7

Browse files
committed
Translate the pattern type of a pack expansion when emitting
type metadata for layout. Fixes rdar://110971671
1 parent 61a09ef commit fdd3aa7

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

lib/IRGen/MetadataRequest.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3307,11 +3307,10 @@ class GetFormalTypeWithSameLayout
33073307
}
33083308

33093309
CanType visitPackExpansionType(CanPackExpansionType ty) {
3310-
return ty;
3311-
}
3312-
3313-
CanType visitPackElementType(CanPackElementType ty) {
3314-
llvm_unreachable("not implemented for PackElementType");
3310+
CanType pattern = ty.getPatternType();
3311+
CanType loweredPattern = visit(ty.getPatternType());
3312+
if (pattern == loweredPattern) return ty;
3313+
return CanPackExpansionType::get(loweredPattern, ty.getCountType());
33153314
}
33163315

33173316
CanType visitTupleType(CanTupleType ty) {

test/IRGen/variadic_generics.sil

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,19 @@ bb0:
177177
%len = pack_length $Pack{repeat each T, repeat each T, Int, Float, String}
178178
return %len : $Builtin.Word
179179
}
180+
181+
// Translate the pattern type of a pack expansion type when
182+
// emitting tuple type metadata for layout. rdar://110971671
183+
184+
// CHECK-LABEL: define{{.*}} @test_pack_expansion_for_layout
185+
// CHECK: [[PACK_LEN:%.*]] = add [[INT]] %0, 1
186+
// CHECK-NEXT: [[VANISHES:%.*]] = icmp eq [[INT]] [[PACK_LEN]], 1
187+
// CHECK-NEXT: br i1 [[VANISHES]],
188+
// CHECK: call swiftcc %swift.metadata_response @swift_getTupleTypeMetadata(
189+
sil @test_pack_expansion_for_layout : $<each T> () -> () {
190+
bb0:
191+
%tuple = alloc_stack $(Int, repeat () async throws -> each T)
192+
dealloc_stack %tuple : $*(Int, repeat () async throws -> each T)
193+
%result = tuple ()
194+
return %result : $()
195+
}

0 commit comments

Comments
 (0)