@@ -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
@@ -1636,9 +1643,9 @@ namespace {
1636
1643
1637
1644
// Add a PackElementOf constraint for 'each T' type reprs.
1638
1645
PackExpansionExpr *elementEnv = nullptr ;
1639
- if (!PackElementEnvironments .empty ()) {
1646
+ if (!OuterExpansions .empty ()) {
1640
1647
options |= TypeResolutionFlags::AllowPackReferences;
1641
- elementEnv = PackElementEnvironments .back ();
1648
+ elementEnv = OuterExpansions .back ();
1642
1649
}
1643
1650
const auto packElementOpener = OpenPackElementType (CS, locator, elementEnv);
1644
1651
@@ -1889,9 +1896,9 @@ namespace {
1889
1896
TypeResolutionOptions (TypeResolverContext::InExpression);
1890
1897
for (auto specializationArg : specializationArgs) {
1891
1898
PackExpansionExpr *elementEnv = nullptr ;
1892
- if (!PackElementEnvironments .empty ()) {
1899
+ if (!OuterExpansions .empty ()) {
1893
1900
options |= TypeResolutionFlags::AllowPackReferences;
1894
- elementEnv = PackElementEnvironments .back ();
1901
+ elementEnv = OuterExpansions .back ();
1895
1902
}
1896
1903
const auto result = TypeResolution::resolveContextualType (
1897
1904
specializationArg, CurDC, options,
@@ -3055,6 +3062,9 @@ namespace {
3055
3062
Constraint::create (CS, ConstraintKind::FallbackType, closureType,
3056
3063
inferredType, locator, referencedVars));
3057
3064
3065
+ if (!OuterExpansions.empty ())
3066
+ CS.setCapturedExpansions (closure, OuterExpansions);
3067
+
3058
3068
CS.setClosureType (closure, inferredType);
3059
3069
return closureType;
3060
3070
}
@@ -3160,8 +3170,8 @@ namespace {
3160
3170
}
3161
3171
3162
3172
Type visitPackExpansionExpr (PackExpansionExpr *expr) {
3163
- assert (PackElementEnvironments .back () == expr);
3164
- PackElementEnvironments .pop_back ();
3173
+ assert (OuterExpansions .back () == expr);
3174
+ OuterExpansions .pop_back ();
3165
3175
3166
3176
auto expansionType = CS.getType (expr)->castTo <PackExpansionType>();
3167
3177
auto elementResultType = CS.getType (expr->getPatternExpr ());
@@ -3182,7 +3192,7 @@ namespace {
3182
3192
for (auto pack : expandedPacks) {
3183
3193
Type packType;
3184
3194
// / Skipping over pack elements because the relationship to its
3185
- // / environment is now established during \c addPackElementEnvironment
3195
+ // / environment is now established during \c pushPackExpansionExpr
3186
3196
// / upon visiting its pack expansion and the Shape constraint added
3187
3197
// / upon visiting the pack element.
3188
3198
if (isExpr<PackElementExpr>(pack)) {
@@ -4301,7 +4311,7 @@ namespace {
4301
4311
}
4302
4312
4303
4313
if (auto *expansion = dyn_cast<PackExpansionExpr>(expr)) {
4304
- CG.addPackElementEnvironment (expansion);
4314
+ CG.pushPackExpansionExpr (expansion);
4305
4315
}
4306
4316
4307
4317
return Action::Continue (expr);
0 commit comments