@@ -314,31 +314,54 @@ Type ConstraintSystem::openPackExpansionType(PackExpansionType *expansion,
314314
315315 auto openedPackExpansion = PackExpansionType::get (patternType, shapeType);
316316
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+ }
320331
321332 auto *expansionLoc = getConstraintLocator (locator.withPathElement (
322333 LocatorPathElt::PackExpansionType (openedPackExpansion)));
323334
324335 auto *expansionVar = createTypeVariable (expansionLoc, TVO_PackExpansion,
325336 preparedOverload);
326337
327- ASSERT (!preparedOverload && " Implement below" );
328-
329338 // This constraint is important to make sure that pack expansion always
330339 // has a binding and connect pack expansion var to any type variables
331340 // 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);
337351 return expansionVar;
338352}
339353
340354void 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+
342365 bool inserted = OpenedPackExpansionTypes.insert ({expansion, expansionVar}).second ;
343366 ASSERT (inserted);
344367
@@ -2476,6 +2499,9 @@ void PreparedOverload::discharge(ConstraintSystem &cs,
24762499 cs.recordOpenedExistentialType (cs.getConstraintLocator (locator),
24772500 OpenedExistential);
24782501 }
2502+ for (auto pair : OpenedPackExpansionTypes) {
2503+ cs.recordOpenedPackExpansionType (pair.first , pair.second );
2504+ }
24792505}
24802506
24812507void ConstraintSystem::resolveOverload (ConstraintLocator *locator,
0 commit comments