Skip to content

Commit be00ae8

Browse files
authored
Merge pull request #63256 from hborla/function-parameter-pack-resolution
2 parents 99fb37f + 5d20f03 commit be00ae8

File tree

1 file changed

+19
-52
lines changed

1 file changed

+19
-52
lines changed

lib/Sema/TypeCheckType.cpp

Lines changed: 19 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
42164181
NeverNullType 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

42984265
NeverNullType TypeResolver::resolvePackReference(PackReferenceTypeRepr *repr,

0 commit comments

Comments
 (0)