@@ -855,25 +855,7 @@ Type ConstraintSystem::openUnboundGenericType(GenericTypeDecl *decl,
855855 result = DC->mapTypeIntoContext (result);
856856 }
857857
858- return result.transform ([&](Type type) -> Type {
859- // Although generic parameters are declared with just `each`
860- // their interface types introduce a pack expansion which
861- // means that the solver has to extact generic argument type
862- // variable from Pack{repeat ...} and drop that structure to
863- // make sure that generic argument gets inferred to a pack type.
864- if (auto *packTy = type->getAs <PackType>()) {
865- assert (packTy->getNumElements () == 1 );
866- auto *expansion = packTy->getElementType (0 )->castTo <PackExpansionType>();
867- auto *typeVar = expansion->getPatternType ()->castTo <TypeVariableType>();
868- assert (typeVar->getImpl ().getGenericParameter () &&
869- typeVar->getImpl ().canBindToPack ());
870- return typeVar;
871- }
872-
873- if (auto *expansion = dyn_cast<PackExpansionType>(type.getPointer ()))
874- return openPackExpansionType (expansion, replacements, locator);
875- return type;
876- });
858+ return result;
877859}
878860
879861static void checkNestedTypeConstraints (ConstraintSystem &cs, Type type,
@@ -1022,18 +1004,6 @@ Type ConstraintSystem::openType(Type type, OpenedTypeMap &replacements,
10221004 }
10231005 }
10241006
1025- // While opening variadic generic types that appear in other types
1026- // we need to extract generic parameter from Pack{repeat ...} structure
1027- // that gets introduced by the interface type, see
1028- // \c openUnboundGenericType for more details.
1029- if (auto *packTy = type->getAs <PackType>()) {
1030- if (auto expansionTy = packTy->unwrapSingletonPackExpansion ()) {
1031- auto patternTy = expansionTy->getPatternType ();
1032- if (patternTy->isTypeParameter ())
1033- return openType (patternTy, replacements, locator);
1034- }
1035- }
1036-
10371007 if (auto *expansion = type->getAs <PackExpansionType>()) {
10381008 return openPackExpansionType (expansion, replacements, locator);
10391009 }
@@ -3927,6 +3897,14 @@ struct TypeSimplifier {
39273897 auto countType = expansion->getCountType ().transform (
39283898 TypeSimplifier (CS, GetFixedTypeFn));
39293899
3900+ if (!countType->is <PackType>() &&
3901+ !countType->is <PackArchetypeType>()) {
3902+ SmallVector<Type, 2 > rootParameterPacks;
3903+ countType->getTypeParameterPacks (rootParameterPacks);
3904+ if (!rootParameterPacks.empty ())
3905+ countType = rootParameterPacks[0 ];
3906+ }
3907+
39303908 // If both pattern and count are resolves, let's just return
39313909 // the pattern type for `transformWithPosition` to take care
39323910 // of the rest.
0 commit comments