@@ -318,21 +318,29 @@ irgen::emitTypeMetadataPack(IRGenFunction &IGF,
318
318
return pack;
319
319
}
320
320
321
+ static CanPackArchetypeType
322
+ getForwardedPackArchetypeType (CanPackType packType) {
323
+ if (packType->getNumElements () != 1 )
324
+ return CanPackArchetypeType ();
325
+ auto uncastElement = packType.getElementType (0 );
326
+ auto element = dyn_cast<PackExpansionType>(uncastElement);
327
+ if (!element)
328
+ return CanPackArchetypeType ();
329
+ auto patternType = element.getPatternType ();
330
+ auto packArchetype = dyn_cast<PackArchetypeType>(patternType);
331
+ return packArchetype;
332
+ }
333
+
321
334
MetadataResponse
322
335
irgen::emitTypeMetadataPackRef (IRGenFunction &IGF,
323
336
CanPackType packType,
324
337
DynamicMetadataRequest request) {
325
338
if (auto result = IGF.tryGetLocalTypeMetadata (packType, request))
326
339
return result;
327
340
328
- if (packType->getNumElements () == 1 &&
329
- isa<PackExpansionType>(packType.getElementType (0 ))) {
330
- if (auto packArchetypeType = dyn_cast<PackArchetypeType>(
331
- cast<PackExpansionType>(packType.getElementType (0 ))
332
- .getPatternType ())) {
333
- if (auto result = IGF.tryGetLocalTypeMetadata (packArchetypeType, request))
334
- return result;
335
- }
341
+ if (auto packArchetypeType = getForwardedPackArchetypeType (packType)) {
342
+ if (auto result = IGF.tryGetLocalTypeMetadata (packArchetypeType, request))
343
+ return result;
336
344
}
337
345
338
346
auto pack = emitTypeMetadataPack (IGF, packType, request);
0 commit comments