@@ -966,25 +966,7 @@ Type ConstraintSystem::openUnboundGenericType(GenericTypeDecl *decl,
966966 result = DC->mapTypeIntoContext (result);
967967 }
968968
969- return result.transform ([&](Type type) -> Type {
970- // Although generic parameters are declared with just `each`
971- // their interface types introduce a pack expansion which
972- // means that the solver has to extact generic argument type
973- // variable from Pack{repeat ...} and drop that structure to
974- // make sure that generic argument gets inferred to a pack type.
975- if (auto *packTy = type->getAs <PackType>()) {
976- assert (packTy->getNumElements () == 1 );
977- auto *expansion = packTy->getElementType (0 )->castTo <PackExpansionType>();
978- auto *typeVar = expansion->getPatternType ()->castTo <TypeVariableType>();
979- assert (typeVar->getImpl ().getGenericParameter () &&
980- typeVar->getImpl ().canBindToPack ());
981- return typeVar;
982- }
983-
984- if (auto *expansion = dyn_cast<PackExpansionType>(type.getPointer ()))
985- return openPackExpansionType (expansion, replacements, locator);
986- return type;
987- });
969+ return result;
988970}
989971
990972static void checkNestedTypeConstraints (ConstraintSystem &cs, Type type,
@@ -1133,18 +1115,6 @@ Type ConstraintSystem::openType(Type type, OpenedTypeMap &replacements,
11331115 }
11341116 }
11351117
1136- // While opening variadic generic types that appear in other types
1137- // we need to extract generic parameter from Pack{repeat ...} structure
1138- // that gets introduced by the interface type, see
1139- // \c openUnboundGenericType for more details.
1140- if (auto *packTy = type->getAs <PackType>()) {
1141- if (auto expansionTy = packTy->unwrapSingletonPackExpansion ()) {
1142- auto patternTy = expansionTy->getPatternType ();
1143- if (patternTy->isTypeParameter ())
1144- return openType (patternTy, replacements, locator);
1145- }
1146- }
1147-
11481118 if (auto *expansion = type->getAs <PackExpansionType>()) {
11491119 return openPackExpansionType (expansion, replacements, locator);
11501120 }
@@ -4140,6 +4110,14 @@ struct TypeSimplifier {
41404110 auto countType = expansion->getCountType ().transform (
41414111 TypeSimplifier (CS, GetFixedTypeFn));
41424112
4113+ if (!countType->is <PackType>() &&
4114+ !countType->is <PackArchetypeType>()) {
4115+ SmallVector<Type, 2 > rootParameterPacks;
4116+ countType->getTypeParameterPacks (rootParameterPacks);
4117+ if (!rootParameterPacks.empty ())
4118+ countType = rootParameterPacks[0 ];
4119+ }
4120+
41434121 // If both pattern and count are resolves, let's just return
41444122 // the pattern type for `transformWithPosition` to take care
41454123 // of the rest.
0 commit comments