@@ -2030,9 +2030,6 @@ namespace {
20302030 NeverNullType resolveImplicitlyUnwrappedOptionalType (
20312031 ImplicitlyUnwrappedOptionalTypeRepr *repr,
20322032 TypeResolutionOptions options, bool isDirect);
2033- std::pair<Type, Type>
2034- maybeResolvePackExpansionType (PackExpansionTypeRepr *repr,
2035- TypeResolutionOptions options);
20362033 NeverNullType resolveVarargType (VarargTypeRepr *repr,
20372034 TypeResolutionOptions options);
20382035 NeverNullType resolvePackType (PackTypeRepr *repr,
@@ -3158,20 +3155,7 @@ TypeResolver::resolveASTFunctionTypeParams(TupleTypeRepr *inputRepr,
31583155 // Do we have an old-style variadic parameter?
31593156 bool variadic = false ;
31603157
3161- if (auto *packExpansionTypeRepr = dyn_cast<PackExpansionTypeRepr>(nestedRepr)) {
3162- auto patternOptions = elementOptions;
3163- patternOptions.setContext (TypeResolverContext::VariadicFunctionInput);
3164-
3165- auto pair = maybeResolvePackExpansionType (packExpansionTypeRepr,
3166- patternOptions);
3167- if (pair.first ->hasError ()) {
3168- elements.emplace_back (ErrorType::get (getASTContext ()));
3169- continue ;
3170- }
3171-
3172- // We have a pack expansion type.
3173- ty = PackExpansionType::get (pair.first , pair.second );
3174- } else if (auto *varargTypeRepr = dyn_cast<VarargTypeRepr>(nestedRepr)) {
3158+ if (auto *varargTypeRepr = dyn_cast<VarargTypeRepr>(nestedRepr)) {
31753159 if (ellipsisLoc) {
31763160 diagnose (varargTypeRepr->getLoc (),
31773161 diag::multiple_ellipsis_in_tuple)
@@ -4194,25 +4178,6 @@ NeverNullType TypeResolver::resolveImplicitlyUnwrappedOptionalType(
41944178 return uncheckedOptionalTy;
41954179}
41964180
4197- std::pair<Type, Type>
4198- TypeResolver::maybeResolvePackExpansionType (PackExpansionTypeRepr *repr,
4199- TypeResolutionOptions options) {
4200- auto elementOptions = options;
4201- elementOptions |= TypeResolutionFlags::AllowPackReferences;
4202- auto patternTy = resolveType (repr->getPatternType (), elementOptions);
4203- if (patternTy->hasError ())
4204- return std::make_pair (ErrorType::get (getASTContext ()), Type ());
4205-
4206- // Find the first type parameter pack and use that as the count type.
4207- SmallVector<Type, 1 > rootParameterPacks;
4208- patternTy->getTypeParameterPacks (rootParameterPacks);
4209-
4210- if (rootParameterPacks.empty ())
4211- return std::make_pair (patternTy, Type ());
4212-
4213- return std::make_pair (patternTy, rootParameterPacks[0 ]);
4214- }
4215-
42164181NeverNullType TypeResolver::resolveVarargType (VarargTypeRepr *repr,
42174182 TypeResolutionOptions options) {
42184183 auto element = resolveType (repr->getElementType (), options);
@@ -4257,32 +4222,34 @@ NeverNullType TypeResolver::resolvePackExpansionType(PackExpansionTypeRepr *repr
42574222 TypeResolutionOptions options) {
42584223 auto &ctx = getASTContext ();
42594224
4260- auto pair = maybeResolvePackExpansionType (repr, options);
4261-
4262- if (pair.first ->hasError ())
4225+ auto elementOptions = options;
4226+ elementOptions |= TypeResolutionFlags::AllowPackReferences;
4227+ auto patternType = resolveType (repr->getPatternType (), elementOptions);
4228+ if (patternType->hasError ())
42634229 return ErrorType::get (ctx);
42644230
4265- // We might not allow variadic expansions here at all.
4266- if (!options.isPackExpansionSupported (getDeclContext ())) {
4267- diagnose (repr->getLoc (), diag::expansion_not_allowed, pair.first );
4268- return ErrorType::get (ctx);
4269- }
4231+ // Find the first type parameter pack and use that as the count type.
4232+ SmallVector<Type, 2 > rootParameterPacks;
4233+ patternType->getTypeParameterPacks (rootParameterPacks);
42704234
4271- if (!pair. second ) {
4235+ if (rootParameterPacks. empty () ) {
42724236 // The pattern type must contain at least one pack reference.
4273- diagnose (repr->getLoc (), diag::expansion_not_variadic, pair. first )
4237+ diagnose (repr->getLoc (), diag::expansion_not_variadic, patternType )
42744238 .highlight (repr->getSourceRange ());
42754239 return ErrorType::get (ctx);
42764240 }
42774241
4242+ // We might not allow variadic expansions here at all.
4243+ if (!options.isPackExpansionSupported (getDeclContext ())) {
4244+ diagnose (repr->getLoc (), diag::expansion_not_allowed, patternType);
4245+ return ErrorType::get (ctx);
4246+ }
4247+
42784248 if (resolution.getStage () == TypeResolutionStage::Interface) {
42794249 auto genericSig = resolution.getGenericSignature ();
4280- auto shapeType = genericSig->getReducedShape (pair.second );
4281-
4282- auto result = PackExpansionType::get (pair.first , shapeType);
4250+ auto shapeType = genericSig->getReducedShape (rootParameterPacks[0 ]);
4251+ auto result = PackExpansionType::get (patternType, shapeType);
42834252
4284- SmallVector<Type, 2 > rootParameterPacks;
4285- pair.first ->getTypeParameterPacks (rootParameterPacks);
42864253 for (auto type : rootParameterPacks) {
42874254 if (!genericSig->haveSameShape (type, shapeType)) {
42884255 ctx.Diags .diagnose (repr->getLoc (), diag::expansion_not_same_shape,
@@ -4292,7 +4259,7 @@ NeverNullType TypeResolver::resolvePackExpansionType(PackExpansionTypeRepr *repr
42924259 return result;
42934260 }
42944261
4295- return PackExpansionType::get (pair. first , pair. second );
4262+ return PackExpansionType::get (patternType, rootParameterPacks[ 0 ] );
42964263}
42974264
42984265NeverNullType TypeResolver::resolvePackReference (PackReferenceTypeRepr *repr,
0 commit comments