@@ -718,52 +718,58 @@ GenericEnvironment::mapElementTypeIntoPackContext(Type type) const {
718
718
// generic environment.
719
719
assert (type->hasElementArchetype ());
720
720
721
- ElementArchetypeType *element = nullptr ;
722
- type.visit ([&](Type type) {
723
- auto archetype = type->getAs <ElementArchetypeType>();
724
- if (!element && archetype)
725
- element = archetype;
726
- });
721
+ GenericEnvironment *elementEnv = nullptr ;
727
722
728
- auto sig = getGenericSignature ();
729
- auto *elementEnv = element->getGenericEnvironment ();
730
- auto shapeClass = elementEnv->getOpenedElementShapeClass ();
731
- QueryInterfaceTypeSubstitutions substitutions (this );
723
+ // Map element archetypes to interface types in the element generic
724
+ // environment's signature.
725
+ type = type.subst (
726
+ [&](SubstitutableType *type) -> Type {
727
+ auto *archetype = cast<ArchetypeType>(type);
732
728
733
- type = type->mapTypeOutOfContext ();
729
+ if (isa<OpenedArchetypeType>(archetype))
730
+ return archetype;
734
731
735
- auto interfaceType = element->getInterfaceType ();
732
+ if (isa<ElementArchetypeType>(archetype)) {
733
+ assert (!elementEnv ||
734
+ elementEnv == archetype->getGenericEnvironment ());
735
+ elementEnv = archetype->getGenericEnvironment ();
736
+ }
736
737
737
- llvm::SmallDenseMap<GenericParamKey, GenericTypeParamType *>
738
- packParamForElement;
739
- auto elementDepth = interfaceType->getRootGenericParam ()->getDepth ();
738
+ return archetype->getInterfaceType ();
739
+ },
740
+ MakeAbstractConformanceForGenericType (),
741
+ SubstFlags::AllowLoweredTypes |
742
+ SubstFlags::PreservePackExpansionLevel);
740
743
744
+ auto shapeClass = elementEnv->getOpenedElementShapeClass ();
745
+
746
+ llvm::SmallVector<GenericTypeParamType *, 2 > members;
747
+ auto elementDepth = elementEnv->getGenericSignature ()->getMaxDepth ();
748
+
749
+ auto sig = getGenericSignature ();
741
750
for (auto *genericParam : sig.getGenericParams ()) {
742
751
if (!genericParam->isParameterPack ())
743
752
continue ;
744
753
745
754
if (!sig->haveSameShape (genericParam, shapeClass))
746
755
continue ;
747
756
748
- GenericParamKey elementKey (/* isParameterPack*/ false ,
749
- /* depth*/ elementDepth,
750
- /* index*/ packParamForElement.size ());
751
- packParamForElement[elementKey] = genericParam;
757
+ members.push_back (genericParam);
752
758
}
753
759
754
- // Map element archetypes to the pack archetypes by converting
755
- // element types to interface types and adding the isParameterPack
756
- // bit. Then, map type parameters to archetypes.
760
+ // Map element interface types to pack archetypes.
761
+ QueryInterfaceTypeSubstitutions mapIntoContext (this );
757
762
return type.subst (
758
763
[&](SubstitutableType *type) {
759
764
auto *genericParam = type->getAs <GenericTypeParamType>();
760
765
if (!genericParam)
761
766
return Type ();
762
767
763
- if (auto *packParam = packParamForElement[{genericParam}])
764
- return substitutions (packParam);
765
-
766
- return substitutions (genericParam);
768
+ if (genericParam->getDepth () == elementDepth) {
769
+ genericParam = members[genericParam->getIndex ()];
770
+ assert (genericParam->isParameterPack ());
771
+ }
772
+ return mapIntoContext (genericParam);
767
773
},
768
774
LookUpConformanceInSignature (sig.getPointer ()),
769
775
SubstFlags::PreservePackExpansionLevel);
0 commit comments