@@ -314,31 +314,54 @@ Type ConstraintSystem::openPackExpansionType(PackExpansionType *expansion,
314
314
315
315
auto openedPackExpansion = PackExpansionType::get (patternType, shapeType);
316
316
317
- auto known = OpenedPackExpansionTypes.find (openedPackExpansion);
318
- if (known != OpenedPackExpansionTypes.end ())
319
- return known->second ;
317
+ // FIXME: It's silly that we need to do this. The whole concept of
318
+ // "opening" pack expansions is broken.
319
+ {
320
+ if (preparedOverload) {
321
+ for (auto pair : preparedOverload->OpenedPackExpansionTypes ) {
322
+ if (pair.first == openedPackExpansion)
323
+ return pair.second ;
324
+ }
325
+ }
326
+
327
+ auto known = OpenedPackExpansionTypes.find (openedPackExpansion);
328
+ if (known != OpenedPackExpansionTypes.end ())
329
+ return known->second ;
330
+ }
320
331
321
332
auto *expansionLoc = getConstraintLocator (locator.withPathElement (
322
333
LocatorPathElt::PackExpansionType (openedPackExpansion)));
323
334
324
335
auto *expansionVar = createTypeVariable (expansionLoc, TVO_PackExpansion,
325
336
preparedOverload);
326
337
327
- ASSERT (!preparedOverload && " Implement below" );
328
-
329
338
// This constraint is important to make sure that pack expansion always
330
339
// has a binding and connect pack expansion var to any type variables
331
340
// that appear in pattern and shape types.
332
- addUnsolvedConstraint (Constraint::create (*this , ConstraintKind::FallbackType,
333
- expansionVar, openedPackExpansion,
334
- expansionLoc));
335
-
336
- recordOpenedPackExpansionType (openedPackExpansion, expansionVar);
341
+ auto *c = Constraint::create (*this , ConstraintKind::FallbackType,
342
+ expansionVar, openedPackExpansion,
343
+ expansionLoc);
344
+ if (preparedOverload)
345
+ preparedOverload->Constraints .push_back (c);
346
+ else
347
+ addUnsolvedConstraint (c);
348
+
349
+ recordOpenedPackExpansionType (openedPackExpansion, expansionVar,
350
+ preparedOverload);
337
351
return expansionVar;
338
352
}
339
353
340
354
void ConstraintSystem::recordOpenedPackExpansionType (PackExpansionType *expansion,
341
- TypeVariableType *expansionVar) {
355
+ TypeVariableType *expansionVar,
356
+ PreparedOverload *preparedOverload) {
357
+ if (preparedOverload) {
358
+ ASSERT (PreparingOverload);
359
+ preparedOverload->OpenedPackExpansionTypes .push_back ({expansion, expansionVar});
360
+ return ;
361
+ }
362
+
363
+ ASSERT (!PreparingOverload);
364
+
342
365
bool inserted = OpenedPackExpansionTypes.insert ({expansion, expansionVar}).second ;
343
366
ASSERT (inserted);
344
367
@@ -2476,6 +2499,9 @@ void PreparedOverload::discharge(ConstraintSystem &cs,
2476
2499
cs.recordOpenedExistentialType (cs.getConstraintLocator (locator),
2477
2500
OpenedExistential);
2478
2501
}
2502
+ for (auto pair : OpenedPackExpansionTypes) {
2503
+ cs.recordOpenedPackExpansionType (pair.first , pair.second );
2504
+ }
2479
2505
}
2480
2506
2481
2507
void ConstraintSystem::resolveOverload (ConstraintLocator *locator,
0 commit comments