@@ -262,16 +262,13 @@ static llvm::Value *bindWitnessTableAtIndex(IRGenFunction &IGF,
262262}
263263
264264struct OpenedElementContext {
265- GenericEnvironment *packEnvironment;
266- CanGenericSignature packSignature;
267-
268- GenericEnvironment *elementEnvironment;
269- CanGenericSignature elementSignature;
265+ GenericEnvironment *environment;
266+ CanGenericSignature signature;
270267
271268 static OpenedElementContext
272269 createForPackExpansion (IRGenFunction &IGF, CanPackExpansionType expansionTy) {
273270 // Get the outer generic signature and environment.
274- auto *genericEnv = cast<PackArchetypeType >(expansionTy.getCountType ())
271+ auto *genericEnv = cast<ArchetypeType >(expansionTy.getCountType ())
275272 ->getGenericEnvironment ();
276273 auto subMap = genericEnv->getForwardingSubstitutionMap ();
277274
@@ -282,15 +279,15 @@ struct OpenedElementContext {
282279 auto *elementEnv = GenericEnvironment::forOpenedElement (
283280 elementSig, UUID::fromTime (), expansionTy.getCountType (), subMap);
284281
285- return {genericEnv, genericSig, elementEnv, elementSig};
282+ return {elementEnv, elementSig};
286283 }
287284};
288285
289286static void bindElementSignatureRequirementsAtIndex (
290287 IRGenFunction &IGF, OpenedElementContext const &context, llvm::Value *index,
291288 DynamicMetadataRequest request) {
292289 enumerateGenericSignatureRequirements (
293- context.elementSignature , [&](GenericRequirement requirement) {
290+ context.signature , [&](GenericRequirement requirement) {
294291 switch (requirement.getKind ()) {
295292 case GenericRequirement::Kind::Shape:
296293 case GenericRequirement::Kind::Metadata:
@@ -299,12 +296,12 @@ static void bindElementSignatureRequirementsAtIndex(
299296 case GenericRequirement::Kind::MetadataPack: {
300297 auto ty = requirement.getTypeParameter ();
301298 auto patternPackArchetype = cast<PackArchetypeType>(
302- context.packEnvironment -> mapTypeIntoContext (ty)
299+ context.environment -> maybeApplyOuterContextSubstitutions (ty)
303300 ->getCanonicalType ());
304301 auto response =
305302 IGF.emitTypeMetadataRef (patternPackArchetype, request);
306303 auto elementArchetype =
307- context.elementEnvironment
304+ context.environment
308305 ->mapPackTypeIntoElementContext (
309306 patternPackArchetype->getInterfaceType ())
310307 ->getCanonicalType ();
@@ -319,20 +316,20 @@ static void bindElementSignatureRequirementsAtIndex(
319316 auto ty = requirement.getTypeParameter ();
320317 auto proto = requirement.getProtocol ();
321318 auto patternPackArchetype = cast<PackArchetypeType>(
322- context.packEnvironment -> mapTypeIntoContext (ty)
319+ context.environment -> maybeApplyOuterContextSubstitutions (ty)
323320 ->getCanonicalType ());
324321 auto elementArchetype =
325- context.elementEnvironment
322+ context.environment
326323 ->mapPackTypeIntoElementContext (
327324 patternPackArchetype->getInterfaceType ())
328325 ->getCanonicalType ();
329326 llvm::Value *_metadata = nullptr ;
330327 auto packConformance =
331- context.packSignature ->lookupConformance (ty, proto);
328+ context.signature ->lookupConformance (ty, proto);
332329 auto *wtablePack = emitWitnessTableRef (IGF, patternPackArchetype,
333330 &_metadata, packConformance);
334331 auto elementConformance =
335- context.elementSignature ->lookupConformance (ty, proto);
332+ context.signature ->lookupConformance (ty, proto);
336333 auto *wtable = bindWitnessTableAtIndex (
337334 IGF, elementArchetype, elementConformance, wtablePack, index);
338335 assert (wtable);
@@ -350,7 +347,7 @@ static llvm::Value *emitPackExpansionElementMetadata(
350347
351348 // Replace pack archetypes with element archetypes in the pattern type.
352349 auto instantiatedPatternTy =
353- context.elementEnvironment
350+ context.environment
354351 ->mapPackTypeIntoElementContext (patternTy->mapTypeOutOfContext ())
355352 ->getCanonicalType ();
356353
@@ -526,11 +523,11 @@ static llvm::Value *emitPackExpansionElementWitnessTable(
526523
527524 // Replace pack archetypes with element archetypes in the pattern type.
528525 auto instantiatedPatternTy =
529- context.elementEnvironment
526+ context.environment
530527 ->mapPackTypeIntoElementContext (patternTy->mapTypeOutOfContext ())
531528 ->getCanonicalType ();
532529 auto instantiatedConformance =
533- context.elementEnvironment ->getGenericSignature ()->lookupConformance (
530+ context.environment ->getGenericSignature ()->lookupConformance (
534531 instantiatedPatternTy, conformance.getRequirement ());
535532
536533 // Emit the element witness table.
0 commit comments