@@ -1560,14 +1560,13 @@ class Solution {
15601560 llvm::DenseMap<PackExpansionType *, TypeVariableType *>
15611561 OpenedPackExpansionTypes;
15621562
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 * >
15661566 PackExpansionEnvironments;
15671567
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;
15711570
15721571 // / The locators of \c Defaultable constraints whose defaults were used.
15731572 llvm::DenseSet<ConstraintLocator *> DefaultedConstraints;
@@ -1811,6 +1810,11 @@ class Solution {
18111810 return Type ();
18121811 }
18131812
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+
18141818 // / For a given locator describing a function argument conversion, or a
18151819 // / constraint within an argument conversion, returns information about the
18161820 // / application of the argument to its parameter. If the locator is not
@@ -2408,11 +2412,11 @@ class ConstraintSystem {
24082412 llvm::SmallDenseMap<PackExpansionType *, TypeVariableType *, 4 >
24092413 OpenedPackExpansionTypes;
24102414
2411- llvm::SmallDenseMap<ConstraintLocator *, std::pair<UUID, Type> , 4 >
2415+ llvm::SmallDenseMap<PackExpansionExpr *, GenericEnvironment * , 4 >
24122416 PackExpansionEnvironments;
24132417
24142418 llvm::SmallDenseMap<PackElementExpr *, PackExpansionExpr *, 2 >
2415- PackEnvironments ;
2419+ PackElementExpansions ;
24162420
24172421 llvm::SmallVector<GenericEnvironment *, 4 > PackElementGenericEnvironments;
24182422
@@ -3371,25 +3375,39 @@ class ConstraintSystem {
33713375 void recordOpenedExistentialType (ConstraintLocator *locator,
33723376 OpenedArchetypeType *opened);
33733377
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);
33773388
33783389 // / 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 );
33813392
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+ }
33843398
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);
33893407
33903408 // / 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);
33933411 ASSERT (erased);
33943412 }
33953413
@@ -5024,6 +5042,11 @@ class ConstraintSystem {
50245042 TypeMatchOptions flags,
50255043 ConstraintLocatorBuilder locator);
50265044
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+
50275050 // / Attempt to simplify a PackElementOf constraint.
50285051 // /
50295052 // / Solving this constraint is delayed until the element type is fully
0 commit comments