@@ -1560,14 +1560,13 @@ class Solution {
1560
1560
llvm::DenseMap<PackExpansionType *, TypeVariableType *>
1561
1561
OpenedPackExpansionTypes;
1562
1562
1563
- // / The pack expansion environment that can open pack elements for
1564
- // / a given locator .
1565
- llvm::DenseMap<ConstraintLocator *, std::pair<UUID, Type> >
1563
+ // / The generic environment that can open pack elements for a given
1564
+ // / pack expansion .
1565
+ llvm::DenseMap<PackExpansionExpr *, GenericEnvironment * >
1566
1566
PackExpansionEnvironments;
1567
1567
1568
- // / The pack expansion environment that can open a given pack element.
1569
- llvm::DenseMap<PackElementExpr *, PackExpansionExpr *>
1570
- PackEnvironments;
1568
+ // / The pack expansion expression for a given pack element.
1569
+ llvm::DenseMap<PackElementExpr *, PackExpansionExpr *> PackElementExpansions;
1571
1570
1572
1571
// / The locators of \c Defaultable constraints whose defaults were used.
1573
1572
llvm::DenseSet<ConstraintLocator *> DefaultedConstraints;
@@ -1811,6 +1810,11 @@ class Solution {
1811
1810
return Type ();
1812
1811
}
1813
1812
1813
+ // / Retrieve the generic environment for the opened element of a given pack
1814
+ // / expansion, or \c nullptr if no environment was recorded.
1815
+ GenericEnvironment *
1816
+ getPackExpansionEnvironment (PackExpansionExpr *expr) const ;
1817
+
1814
1818
// / For a given locator describing a function argument conversion, or a
1815
1819
// / constraint within an argument conversion, returns information about the
1816
1820
// / application of the argument to its parameter. If the locator is not
@@ -2408,11 +2412,11 @@ class ConstraintSystem {
2408
2412
llvm::SmallDenseMap<PackExpansionType *, TypeVariableType *, 4 >
2409
2413
OpenedPackExpansionTypes;
2410
2414
2411
- llvm::SmallDenseMap<ConstraintLocator *, std::pair<UUID, Type> , 4 >
2415
+ llvm::SmallDenseMap<PackExpansionExpr *, GenericEnvironment * , 4 >
2412
2416
PackExpansionEnvironments;
2413
2417
2414
2418
llvm::SmallDenseMap<PackElementExpr *, PackExpansionExpr *, 2 >
2415
- PackEnvironments ;
2419
+ PackElementExpansions ;
2416
2420
2417
2421
llvm::SmallVector<GenericEnvironment *, 4 > PackElementGenericEnvironments;
2418
2422
@@ -3371,25 +3375,39 @@ class ConstraintSystem {
3371
3375
void recordOpenedExistentialType (ConstraintLocator *locator,
3372
3376
OpenedArchetypeType *opened);
3373
3377
3374
- // / Get the opened element generic environment for the given locator.
3375
- GenericEnvironment *getPackElementEnvironment (ConstraintLocator *locator,
3376
- CanType shapeClass);
3378
+ // / Retrieve the generic environment for the opened element of a given pack
3379
+ // / expansion, or \c nullptr if no environment was recorded yet.
3380
+ GenericEnvironment *
3381
+ getPackExpansionEnvironment (PackExpansionExpr *expr) const ;
3382
+
3383
+ // / Create a new opened element generic environment for the given pack
3384
+ // / expansion.
3385
+ GenericEnvironment *
3386
+ createPackExpansionEnvironment (PackExpansionExpr *expr,
3387
+ CanGenericTypeParamType shapeParam);
3377
3388
3378
3389
// / Update PackExpansionEnvironments and record a change in the trail.
3379
- void recordPackExpansionEnvironment (ConstraintLocator *locator ,
3380
- std::pair<UUID, Type> uuidAndShape );
3390
+ void recordPackExpansionEnvironment (PackExpansionExpr *expr ,
3391
+ GenericEnvironment *env );
3381
3392
3382
- // / Get the opened element generic environment for the given pack element.
3383
- PackExpansionExpr *getPackEnvironment (PackElementExpr *packElement) const ;
3393
+ // / Undo the above change.
3394
+ void removePackExpansionEnvironment (PackExpansionExpr *expr) {
3395
+ bool erased = PackExpansionEnvironments.erase (expr);
3396
+ ASSERT (erased);
3397
+ }
3384
3398
3385
- // / Associate an opened element generic environment to a pack element,
3386
- // / and record a change in the trail.
3387
- void addPackEnvironment (PackElementExpr *packElement,
3388
- PackExpansionExpr *packExpansion);
3399
+ // / Get the pack expansion expr for the given pack element.
3400
+ PackExpansionExpr *
3401
+ getPackElementExpansion (PackElementExpr *packElement) const ;
3402
+
3403
+ // / Associate a pack element with a given pack expansion, and record the
3404
+ // / change in the trail.
3405
+ void recordPackElementExpansion (PackElementExpr *packElement,
3406
+ PackExpansionExpr *packExpansion);
3389
3407
3390
3408
// / Undo the above change.
3391
- void removePackEnvironment (PackElementExpr *packElement) {
3392
- bool erased = PackEnvironments .erase (packElement);
3409
+ void removePackElementExpansion (PackElementExpr *packElement) {
3410
+ bool erased = PackElementExpansions .erase (packElement);
3393
3411
ASSERT (erased);
3394
3412
}
3395
3413
@@ -5024,6 +5042,11 @@ class ConstraintSystem {
5024
5042
TypeMatchOptions flags,
5025
5043
ConstraintLocatorBuilder locator);
5026
5044
5045
+ // / Attempt to match a pack element type with the fully resolved pattern type
5046
+ // / for the pack expansion.
5047
+ SolutionKind matchPackElementType (Type elementType, Type patternType,
5048
+ ConstraintLocatorBuilder locator);
5049
+
5027
5050
// / Attempt to simplify a PackElementOf constraint.
5028
5051
// /
5029
5052
// / Solving this constraint is delayed until the element type is fully
0 commit comments