Skip to content

Commit 454913a

Browse files
committed
[TypeResolution] Plumb a pack element opener function through type resolution.
1 parent d7cf7fb commit 454913a

12 files changed

+137
-56
lines changed

lib/Sema/CSGen.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1419,8 +1419,11 @@ namespace {
14191419
// Introduce type variables for unbound generics.
14201420
const auto genericOpener = OpenUnboundGenericType(CS, locator);
14211421
const auto placeholderHandler = HandlePlaceholderType(CS, locator);
1422+
// FIXME: Open pack elements with a PackElementOf constraint.
1423+
OpenPackElementFn packElementOpener = nullptr;
14221424
const auto result = TypeResolution::resolveContextualType(
1423-
repr, CS.DC, resCtx, genericOpener, placeholderHandler);
1425+
repr, CS.DC, resCtx, genericOpener, placeholderHandler,
1426+
packElementOpener);
14241427
if (result->hasError()) {
14251428
CS.recordFix(
14261429
IgnoreInvalidASTNode::create(CS, CS.getConstraintLocator(locator)));
@@ -1666,7 +1669,9 @@ namespace {
16661669
specializationArg, CurDC, options,
16671670
// Introduce type variables for unbound generics.
16681671
OpenUnboundGenericType(CS, locator),
1669-
HandlePlaceholderType(CS, locator));
1672+
HandlePlaceholderType(CS, locator),
1673+
// FIXME: Open pack elements with a PackElementOf constraint.
1674+
/*packElementOpener*/ nullptr);
16701675
if (result->hasError())
16711676
return true;
16721677

@@ -1730,7 +1735,9 @@ namespace {
17301735
specializations[i], CS.DC, options,
17311736
// Introduce type variables for unbound generics.
17321737
OpenUnboundGenericType(CS, locator),
1733-
HandlePlaceholderType(CS, locator));
1738+
HandlePlaceholderType(CS, locator),
1739+
// FIXME: Open pack elements with a PackElementOf constraint.
1740+
/*packElementOpener*/ nullptr);
17341741
if (result->hasError())
17351742
return Type();
17361743

lib/Sema/CSSolver.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1190,7 +1190,9 @@ void ConstraintSystem::shrink(Expr *expr) {
11901190
// example:
11911191
// let foo: [Array<Float>] = [[0], [1], [2]] as [Array]
11921192
// let foo: [Array<Float>] = [[0], [1], [2]] as [Array<_>]
1193-
/*unboundTyOpener*/ nullptr, /*placeholderHandler*/ nullptr);
1193+
/*unboundTyOpener*/ nullptr, /*placeholderHandler*/ nullptr,
1194+
// FIXME: Open pack elements with a PackElementOf constraint.
1195+
/*packElementOpener*/ nullptr);
11941196

11951197
// Looks like coercion type is invalid, let's skip this sub-tree.
11961198
if (coercionType->hasError())

lib/Sema/ConstraintSystem.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,8 @@ Type ConstraintSystem::openUnboundGenericType(GenericTypeDecl *decl,
780780
TypeResolution::forInterface(
781781
DC, None,
782782
[](auto) -> Type { llvm_unreachable("should not be used"); },
783-
[](auto &, auto) -> Type { llvm_unreachable("should not be used"); })
783+
[](auto &, auto) -> Type { llvm_unreachable("should not be used"); },
784+
[](auto) -> Type { llvm_unreachable("should not be used"); })
784785
.applyUnboundGenericArguments(decl, parentTy, SourceLoc(), arguments);
785786
if (!parentTy && !isTypeResolution) {
786787
result = DC->mapTypeIntoContext(result);
@@ -1596,7 +1597,8 @@ ConstraintSystem::getTypeOfReference(ValueDecl *value,
15961597
auto type =
15971598
TypeResolution::forInterface(useDC, TypeResolverContext::InExpression,
15981599
/*unboundTyOpener*/ nullptr,
1599-
/*placeholderHandler*/ nullptr)
1600+
/*placeholderHandler*/ nullptr,
1601+
/*packElementOpener*/ nullptr)
16001602
.resolveTypeInContext(typeDecl, /*foundDC*/ nullptr,
16011603
/*isSpecialized=*/false);
16021604
type = useDC->mapTypeIntoContext(type);
@@ -2957,7 +2959,8 @@ FunctionType::ExtInfo ClosureEffectsRequest::evaluate(
29572959
castType = TypeResolution::resolveContextualType(
29582960
castTypeRepr, DC, TypeResolverContext::InExpression,
29592961
/*unboundTyOpener*/ nullptr,
2960-
/*placeholderHandler*/ nullptr);
2962+
/*placeholderHandler*/ nullptr,
2963+
/*packElementOpener*/ nullptr);
29612964
} else {
29622965
castType = isp->getCastType();
29632966
}

lib/Sema/PreCheckExpr.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,7 +1450,9 @@ TypeExpr *PreCheckExpression::simplifyNestedTypeExpr(UnresolvedDotExpr *UDE) {
14501450
},
14511451
// FIXME: Don't let placeholder types escape type resolution.
14521452
// For now, just return the placeholder type.
1453-
PlaceholderType::get);
1453+
PlaceholderType::get,
1454+
// FIXME: Open pack elements with a PackElementOf constraint.
1455+
/*packElementOpener*/ nullptr);
14541456

14551457
if (BaseTy->mayHaveMembers()) {
14561458
// See if there is a member type with this name.
@@ -2203,7 +2205,9 @@ Expr *PreCheckExpression::simplifyTypeConstructionWithLiteralArg(Expr *E) {
22032205
},
22042206
// FIXME: Don't let placeholder types escape type resolution.
22052207
// For now, just return the placeholder type.
2206-
PlaceholderType::get);
2208+
PlaceholderType::get,
2209+
// FIXME: Open pack elements with a PackElementOf constraint.
2210+
/*packElementOpener*/ nullptr);
22072211

22082212
if (result->hasError())
22092213
return new (getASTContext())

lib/Sema/TypeCheckAttr.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3259,7 +3259,8 @@ ResolveTypeEraserTypeRequest::evaluate(Evaluator &evaluator,
32593259
// are not allowed within this
32603260
// attribute.
32613261
/*unboundTyOpener*/ nullptr,
3262-
/*placeholderHandler*/ nullptr);
3262+
/*placeholderHandler*/ nullptr,
3263+
/*packElementOpener*/ nullptr);
32633264
} else {
32643265
auto *LazyResolver = attr->Resolver;
32653266
assert(LazyResolver && "type eraser was neither parsed nor deserialized?");
@@ -3467,7 +3468,8 @@ void AttributeChecker::visitImplementsAttr(ImplementsAttr *attr) {
34673468
T = TypeResolution::resolveContextualType(attr->getProtocolTypeRepr(), DC,
34683469
TypeResolutionOptions(context),
34693470
/*unboundTyOpener*/ nullptr,
3470-
/*placeholderHandler*/ nullptr);
3471+
/*placeholderHandler*/ nullptr,
3472+
/*packElementOpener*/ nullptr);
34713473
}
34723474

34733475
// Definite error-types were already diagnosed in resolveType.
@@ -3563,7 +3565,8 @@ void AttributeChecker::visitCustomAttr(CustomAttr *attr) {
35633565
// are not allowed within this
35643566
// attribute.
35653567
/*unboundTyOpener*/ nullptr,
3566-
/*placeholderHandler*/ nullptr)
3568+
/*placeholderHandler*/ nullptr,
3569+
/*packElementOpener*/ nullptr)
35673570
.resolveType(typeRepr);
35683571

35693572
if (type->is<ErrorType>()) {
@@ -5883,7 +5886,8 @@ static bool typeCheckDerivativeAttr(DerivativeAttr *attr) {
58835886
baseType = TypeResolution::resolveContextualType(
58845887
baseTypeRepr, derivative->getDeclContext(), options,
58855888
/*unboundTyOpener*/ nullptr,
5886-
/*placeholderHandler*/ nullptr);
5889+
/*placeholderHandler*/ nullptr,
5890+
/*packElementOpener*/ nullptr);
58875891
}
58885892
if (baseType && baseType->hasError())
58895893
return true;
@@ -6479,7 +6483,8 @@ void AttributeChecker::visitTransposeAttr(TransposeAttr *attr) {
64796483
baseType = TypeResolution::resolveContextualType(
64806484
attr->getBaseTypeRepr(), transpose->getDeclContext(), None,
64816485
/*unboundTyOpener*/ nullptr,
6482-
/*placeholderHandler*/ nullptr);
6486+
/*placeholderHandler*/ nullptr,
6487+
/*packElementOpener*/ nullptr);
64836488
}
64846489
auto lookupOptions =
64856490
(attr->getBaseTypeRepr() ? defaultMemberLookupOptions

lib/Sema/TypeCheckDecl.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,7 +1031,8 @@ DefaultDefinitionTypeRequest::evaluate(Evaluator &evaluator,
10311031
// Diagnose unbound generics and
10321032
// placeholders.
10331033
/*unboundTyOpener*/ nullptr,
1034-
/*placeholderHandler*/ nullptr)
1034+
/*placeholderHandler*/ nullptr,
1035+
/*packElementOpener*/ nullptr)
10351036
.resolveType(defaultDefinition);
10361037
}
10371038

@@ -1868,7 +1869,8 @@ UnderlyingTypeRequest::evaluate(Evaluator &evaluator,
18681869
const auto result =
18691870
TypeResolution::forInterface(typeAlias, options,
18701871
/*unboundTyOpener*/ nullptr,
1871-
/*placeholderHandler*/ nullptr)
1872+
/*placeholderHandler*/ nullptr,
1873+
/*packElementOpener*/ nullptr)
18721874
.resolveType(underlyingRepr);
18731875

18741876
if (result->hasError()) {
@@ -2131,7 +2133,8 @@ ResultTypeRequest::evaluate(Evaluator &evaluator, ValueDecl *decl) const {
21312133
auto *const dc = decl->getInnermostDeclContext();
21322134
return TypeResolution::forInterface(dc, options,
21332135
/*unboundTyOpener*/ nullptr,
2134-
PlaceholderType::get)
2136+
PlaceholderType::get,
2137+
/*packElementOpener*/ nullptr)
21352138
.resolveType(resultTyRepr);
21362139
}
21372140

@@ -2268,7 +2271,8 @@ static Type validateParameterType(ParamDecl *decl) {
22682271

22692272
const auto resolution =
22702273
TypeResolution::forInterface(dc, options, unboundTyOpener,
2271-
PlaceholderType::get);
2274+
PlaceholderType::get,
2275+
/*packElementOpener*/ nullptr);
22722276
Ty = resolution.resolveType(patternRepr);
22732277

22742278
// Find the first type parameter pack and use that as the count type.
@@ -2297,7 +2301,8 @@ static Type validateParameterType(ParamDecl *decl) {
22972301

22982302
const auto resolution =
22992303
TypeResolution::forInterface(dc, options, unboundTyOpener,
2300-
PlaceholderType::get);
2304+
PlaceholderType::get,
2305+
/*packElementOpener*/ nullptr);
23012306
Ty = resolution.resolveType(decl->getTypeRepr());
23022307
}
23032308

@@ -2910,7 +2915,8 @@ ExtendedTypeRequest::evaluate(Evaluator &eval, ExtensionDecl *ext) const {
29102915
ext->getDeclContext(), options, nullptr,
29112916
// FIXME: Don't let placeholder types escape type resolution.
29122917
// For now, just return the placeholder type.
2913-
PlaceholderType::get);
2918+
PlaceholderType::get,
2919+
/*packElementOpener*/ nullptr);
29142920

29152921
const auto extendedType = resolution.resolveType(extendedRepr);
29162922

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,8 @@ OpaqueResultTypeRequest::evaluate(Evaluator &evaluator,
178178
// Unbound generics and placeholders are
179179
// meaningless in opaque types.
180180
/*unboundTyOpener*/ nullptr,
181-
/*placeholderHandler*/ nullptr)
181+
/*placeholderHandler*/ nullptr,
182+
/*packElementOpener*/ nullptr)
182183
.resolveType(constraint);
183184

184185
if (constraintType->hasError())
@@ -225,7 +226,8 @@ OpaqueResultTypeRequest::evaluate(Evaluator &evaluator,
225226
auto interfaceType =
226227
TypeResolution::forInterface(opaqueDecl, TypeResolverContext::None,
227228
/*unboundTyOpener*/ nullptr,
228-
/*placeholderHandler*/ nullptr)
229+
/*placeholderHandler*/ nullptr,
230+
/*packElementOpener*/ nullptr)
229231
.resolveType(repr);
230232

231233
// Opaque types cannot be used in parameter position.
@@ -627,7 +629,8 @@ GenericSignatureRequest::evaluate(Evaluator &evaluator,
627629
const auto resolution =
628630
TypeResolution::forStructural(GC, baseOptions,
629631
/*unboundTyOpener*/ nullptr,
630-
/*placeholderHandler*/ nullptr);
632+
/*placeholderHandler*/ nullptr,
633+
/*packElementOpener*/ nullptr);
631634
auto params = func ? func->getParameters()
632635
: subscr ? subscr->getIndices()
633636
: macro->parameterList;
@@ -974,13 +977,15 @@ RequirementRequest::evaluate(Evaluator &evaluator,
974977
case TypeResolutionStage::Structural:
975978
resolution = TypeResolution::forStructural(owner.dc, options,
976979
/*unboundTyOpener*/ nullptr,
977-
/*placeholderHandler*/ nullptr);
980+
/*placeholderHandler*/ nullptr,
981+
/*packElementOpener*/ nullptr);
978982
break;
979983

980984
case TypeResolutionStage::Interface:
981985
resolution = TypeResolution::forInterface(owner.dc, options,
982986
/*unboundTyOpener*/ nullptr,
983-
/*placeholderHandler*/ nullptr);
987+
/*placeholderHandler*/ nullptr,
988+
/*packElementOpener*/ nullptr);
984989
break;
985990
}
986991

@@ -1025,7 +1030,8 @@ Type StructuralTypeRequest::evaluate(Evaluator &evaluator,
10251030
const auto type =
10261031
TypeResolution::forStructural(typeAlias, options,
10271032
/*unboundTyOpener*/ nullptr,
1028-
/*placeholderHandler*/ nullptr)
1033+
/*placeholderHandler*/ nullptr,
1034+
/*packElementOpener*/ nullptr)
10291035
.resolveType(underlyingTypeRepr);
10301036

10311037
auto genericSig = typeAlias->getGenericSignature();

lib/Sema/TypeCheckPattern.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,8 @@ class ResolvePattern : public ASTVisitor<ResolvePattern,
494494
},
495495
// FIXME: Don't let placeholder types escape type resolution.
496496
// For now, just return the placeholder type.
497-
PlaceholderType::get);
497+
PlaceholderType::get,
498+
/*packElementOpener*/ nullptr);
498499

499500
auto *enumDecl = dyn_cast_or_null<EnumDecl>(ty->getAnyNominal());
500501
if (!enumDecl)
@@ -615,7 +616,8 @@ class ResolvePattern : public ASTVisitor<ResolvePattern,
615616
},
616617
// FIXME: Don't let placeholder types escape type resolution.
617618
// For now, just return the placeholder type.
618-
PlaceholderType::get);
619+
PlaceholderType::get,
620+
/*packElementOpener*/ nullptr);
619621

620622
auto *enumDecl = dyn_cast_or_null<EnumDecl>(enumTy->getAnyNominal());
621623
if (!enumDecl)
@@ -717,7 +719,8 @@ static Type
717719
validateTypedPattern(TypedPattern *TP, DeclContext *dc,
718720
TypeResolutionOptions options,
719721
OpenUnboundGenericTypeFn unboundTyOpener,
720-
HandlePlaceholderTypeReprFn placeholderHandler) {
722+
HandlePlaceholderTypeReprFn placeholderHandler,
723+
OpenPackElementFn packElementOpener) {
721724
if (TP->hasType()) {
722725
return TP->getType();
723726
}
@@ -753,7 +756,8 @@ validateTypedPattern(TypedPattern *TP, DeclContext *dc,
753756
}
754757

755758
const auto ty = TypeResolution::resolveContextualType(
756-
Repr, dc, options, unboundTyOpener, placeholderHandler);
759+
Repr, dc, options, unboundTyOpener, placeholderHandler,
760+
packElementOpener);
757761

758762
if (ty->hasError()) {
759763
return ErrorType::get(Context);
@@ -825,6 +829,7 @@ Type PatternTypeRequest::evaluate(Evaluator &evaluator,
825829
case PatternKind::Typed: {
826830
OpenUnboundGenericTypeFn unboundTyOpener = nullptr;
827831
HandlePlaceholderTypeReprFn placeholderHandler = nullptr;
832+
OpenPackElementFn packElementOpener = nullptr;
828833
if (pattern.allowsInference()) {
829834
unboundTyOpener = [](auto unboundTy) {
830835
// FIXME: Don't let unbound generic types escape type resolution.
@@ -836,7 +841,8 @@ Type PatternTypeRequest::evaluate(Evaluator &evaluator,
836841
placeholderHandler = PlaceholderType::get;
837842
}
838843
return validateTypedPattern(cast<TypedPattern>(P), dc, options,
839-
unboundTyOpener, placeholderHandler);
844+
unboundTyOpener, placeholderHandler,
845+
packElementOpener);
840846
}
841847

842848
// A wildcard or name pattern cannot appear by itself in a context
@@ -891,6 +897,7 @@ Type PatternTypeRequest::evaluate(Evaluator &evaluator,
891897
if (somePat->isImplicit() && isa<TypedPattern>(somePat->getSubPattern())) {
892898
OpenUnboundGenericTypeFn unboundTyOpener = nullptr;
893899
HandlePlaceholderTypeReprFn placeholderHandler = nullptr;
900+
OpenPackElementFn packElementOpener = nullptr;
894901
if (pattern.allowsInference()) {
895902
unboundTyOpener = [](auto unboundTy) {
896903
// FIXME: Don't let unbound generic types escape type resolution.
@@ -904,7 +911,8 @@ Type PatternTypeRequest::evaluate(Evaluator &evaluator,
904911

905912
const auto type =
906913
validateTypedPattern(cast<TypedPattern>(somePat->getSubPattern()), dc,
907-
options, unboundTyOpener, placeholderHandler);
914+
options, unboundTyOpener, placeholderHandler,
915+
packElementOpener);
908916

909917
if (!type->hasError()) {
910918
return OptionalType::get(type);
@@ -1092,7 +1100,7 @@ Pattern *TypeChecker::coercePatternToType(ContextualPattern pattern,
10921100
// If the pattern type has a placeholder, we need to resolve it here.
10931101
if (patternType->hasPlaceholder()) {
10941102
validateTypedPattern(cast<TypedPattern>(TP), dc, options, nullptr,
1095-
nullptr);
1103+
nullptr, /*packElementOpener*/ nullptr);
10961104
}
10971105
} else {
10981106
diags.diagnose(P->getLoc(), diag::pattern_type_mismatch_context,
@@ -1321,7 +1329,8 @@ Pattern *TypeChecker::coercePatternToType(ContextualPattern pattern,
13211329
// complain about unbound generics and
13221330
// placeholders here?
13231331
/*unboundTyOpener*/ nullptr,
1324-
/*placeholderHandler*/ nullptr);
1332+
/*placeholderHandler*/ nullptr,
1333+
/*packElementOpener*/ nullptr);
13251334
if (castType->hasError())
13261335
return nullptr;
13271336
IP->setCastType(castType);

lib/Sema/TypeCheckRequestFunctions.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,16 @@ Type InheritedTypeRequest::evaluate(
5858
resolution =
5959
TypeResolution::forStructural(dc, context,
6060
/*unboundTyOpener*/ nullptr,
61-
/*placeholderHandler*/ nullptr);
61+
/*placeholderHandler*/ nullptr,
62+
/*packElementOpener*/ nullptr);
6263
break;
6364

6465
case TypeResolutionStage::Interface:
6566
resolution =
6667
TypeResolution::forInterface(dc, context,
6768
/*unboundTyOpener*/ nullptr,
68-
/*placeholderHandler*/ nullptr);
69+
/*placeholderHandler*/ nullptr,
70+
/*packElementOpener*/ nullptr);
6971
break;
7072
}
7173

0 commit comments

Comments
 (0)