@@ -933,7 +933,7 @@ namespace {
933
933
llvm::MapVector<UnresolvedMemberExpr *, Type> UnresolvedBaseTypes;
934
934
935
935
// / A stack of pack expansions that can open pack elements.
936
- llvm::SmallVector<PackExpansionExpr *, 2 > PackElementEnvironments ;
936
+ llvm::SmallVector<PackExpansionExpr *, 1 > OuterExpansions ;
937
937
938
938
// / Returns false and emits the specified diagnostic if the member reference
939
939
// / base is a nil literal. Returns true otherwise.
@@ -1000,7 +1000,7 @@ namespace {
1000
1000
}
1001
1001
unsigned options = (TVO_CanBindToLValue |
1002
1002
TVO_CanBindToNoEscape);
1003
- if (!PackElementEnvironments .empty ())
1003
+ if (!OuterExpansions .empty ())
1004
1004
options |= TVO_CanBindToPack;
1005
1005
1006
1006
auto tv = CS.createTypeVariable (
@@ -1185,6 +1185,12 @@ namespace {
1185
1185
// result builders could generate constraints for its body
1186
1186
// in the middle of the solving.
1187
1187
CS.setPhase (ConstraintSystemPhase::ConstraintGeneration);
1188
+
1189
+ // Pick up the saved stack of pack expansions so we can continue
1190
+ // to handle pack element references inside the closure body.
1191
+ if (auto *ACE = dyn_cast<AbstractClosureExpr>(CurDC)) {
1192
+ OuterExpansions = CS.getCapturedExpansions (ACE);
1193
+ }
1188
1194
}
1189
1195
1190
1196
virtual ~ConstraintGenerator () {
@@ -1193,8 +1199,8 @@ namespace {
1193
1199
1194
1200
ConstraintSystem &getConstraintSystem () const { return CS; }
1195
1201
1196
- void addPackElementEnvironment (PackExpansionExpr *expr) {
1197
- PackElementEnvironments .push_back (expr);
1202
+ void pushPackExpansionExpr (PackExpansionExpr *expr) {
1203
+ OuterExpansions .push_back (expr);
1198
1204
1199
1205
SmallVector<ASTNode, 2 > expandedPacks;
1200
1206
collectExpandedPacks (expr, expandedPacks);
@@ -1213,6 +1219,7 @@ namespace {
1213
1219
CS.getConstraintLocator (expr, ConstraintLocator::PackShape);
1214
1220
auto *shapeTypeVar = CS.createTypeVariable (
1215
1221
shapeLoc, TVO_CanBindToPack | TVO_CanBindToHole);
1222
+
1216
1223
auto expansionType = PackExpansionType::get (patternType, shapeTypeVar);
1217
1224
CS.setType (expr, expansionType);
1218
1225
}
@@ -1585,7 +1592,7 @@ namespace {
1585
1592
1586
1593
unsigned options = (TVO_CanBindToLValue |
1587
1594
TVO_CanBindToNoEscape);
1588
- if (!PackElementEnvironments .empty ())
1595
+ if (!OuterExpansions .empty ())
1589
1596
options |= TVO_CanBindToPack;
1590
1597
1591
1598
// Create an overload choice referencing this declaration and immediately
@@ -1623,9 +1630,9 @@ namespace {
1623
1630
1624
1631
// Add a PackElementOf constraint for 'each T' type reprs.
1625
1632
PackExpansionExpr *elementEnv = nullptr ;
1626
- if (!PackElementEnvironments .empty ()) {
1633
+ if (!OuterExpansions .empty ()) {
1627
1634
options |= TypeResolutionFlags::AllowPackReferences;
1628
- elementEnv = PackElementEnvironments .back ();
1635
+ elementEnv = OuterExpansions .back ();
1629
1636
}
1630
1637
const auto packElementOpener = OpenPackElementType (CS, locator, elementEnv);
1631
1638
@@ -1876,9 +1883,9 @@ namespace {
1876
1883
TypeResolutionOptions (TypeResolverContext::InExpression);
1877
1884
for (auto specializationArg : specializationArgs) {
1878
1885
PackExpansionExpr *elementEnv = nullptr ;
1879
- if (!PackElementEnvironments .empty ()) {
1886
+ if (!OuterExpansions .empty ()) {
1880
1887
options |= TypeResolutionFlags::AllowPackReferences;
1881
- elementEnv = PackElementEnvironments .back ();
1888
+ elementEnv = OuterExpansions .back ();
1882
1889
}
1883
1890
const auto result = TypeResolution::resolveContextualType (
1884
1891
specializationArg, CurDC, options,
@@ -3042,6 +3049,9 @@ namespace {
3042
3049
Constraint::create (CS, ConstraintKind::FallbackType, closureType,
3043
3050
inferredType, locator, referencedVars));
3044
3051
3052
+ if (!OuterExpansions.empty ())
3053
+ CS.setCapturedExpansions (closure, OuterExpansions);
3054
+
3045
3055
CS.setClosureType (closure, inferredType);
3046
3056
return closureType;
3047
3057
}
@@ -3147,8 +3157,8 @@ namespace {
3147
3157
}
3148
3158
3149
3159
Type visitPackExpansionExpr (PackExpansionExpr *expr) {
3150
- assert (PackElementEnvironments .back () == expr);
3151
- PackElementEnvironments .pop_back ();
3160
+ assert (OuterExpansions .back () == expr);
3161
+ OuterExpansions .pop_back ();
3152
3162
3153
3163
auto expansionType = CS.getType (expr)->castTo <PackExpansionType>();
3154
3164
auto elementResultType = CS.getType (expr->getPatternExpr ());
@@ -3169,7 +3179,7 @@ namespace {
3169
3179
for (auto pack : expandedPacks) {
3170
3180
Type packType;
3171
3181
// / Skipping over pack elements because the relationship to its
3172
- // / environment is now established during \c addPackElementEnvironment
3182
+ // / environment is now established during \c pushPackExpansionExpr
3173
3183
// / upon visiting its pack expansion and the Shape constraint added
3174
3184
// / upon visiting the pack element.
3175
3185
if (isExpr<PackElementExpr>(pack)) {
@@ -4319,7 +4329,7 @@ namespace {
4319
4329
}
4320
4330
4321
4331
if (auto *expansion = dyn_cast<PackExpansionExpr>(expr)) {
4322
- CG.addPackElementEnvironment (expansion);
4332
+ CG.pushPackExpansionExpr (expansion);
4323
4333
}
4324
4334
4325
4335
return Action::Continue (expr);
0 commit comments