@@ -321,9 +321,10 @@ Type ConstraintSystem::openPackExpansionType(PackExpansionType *expansion,
321321 // "opening" pack expansions is broken.
322322 {
323323 if (preparedOverload) {
324- for (auto pair : preparedOverload->OpenedPackExpansionTypes ) {
325- if (pair.first == openedPackExpansion)
326- return pair.second ;
324+ for (auto change : preparedOverload->Changes ) {
325+ if (change.Kind == PreparedOverload::Change::OpenedPackExpansionType &&
326+ change.PackExpansion .TheExpansion == openedPackExpansion)
327+ return change.PackExpansion .TypeVar ;
327328 }
328329 }
329330
@@ -345,7 +346,7 @@ Type ConstraintSystem::openPackExpansionType(PackExpansionType *expansion,
345346 expansionVar, openedPackExpansion,
346347 expansionLoc);
347348 if (preparedOverload)
348- preparedOverload->Constraints . push_back (c);
349+ preparedOverload->addedConstraint (c);
349350 else
350351 addUnsolvedConstraint (c);
351352
@@ -359,7 +360,7 @@ void ConstraintSystem::recordOpenedPackExpansionType(PackExpansionType *expansio
359360 PreparedOverload *preparedOverload) {
360361 if (preparedOverload) {
361362 ASSERT (PreparingOverload);
362- preparedOverload->OpenedPackExpansionTypes . push_back ({ expansion, expansionVar} );
363+ preparedOverload->openedPackExpansionType ( expansion, expansionVar);
363364 return ;
364365 }
365366
@@ -699,8 +700,17 @@ Type ConstraintSystem::getUnopenedTypeOfReference(
699700}
700701
701702void ConstraintSystem::recordOpenedType (
702- ConstraintLocator *locator, ArrayRef<OpenedType> openedTypes) {
703- bool inserted = OpenedTypes.insert ({locator, openedTypes}).second ;
703+ ConstraintLocator *locator, ArrayRef<OpenedType> replacements,
704+ PreparedOverload *preparedOverload) {
705+ if (preparedOverload) {
706+ ASSERT (PreparingOverload);
707+ preparedOverload->openedTypes (replacements);
708+ return ;
709+ }
710+
711+ ASSERT (!PreparingOverload);
712+
713+ bool inserted = OpenedTypes.insert ({locator, replacements}).second ;
704714 ASSERT (inserted);
705715
706716 if (solverState)
@@ -715,16 +725,6 @@ void ConstraintSystem::recordOpenedTypes(
715725 if (replacements.empty ())
716726 return ;
717727
718- if (preparedOverload) {
719- ASSERT (PreparingOverload);
720- ASSERT (preparedOverload->Replacements .empty ());
721- preparedOverload->Replacements .append (
722- replacements.begin (), replacements.end ());
723- return ;
724- }
725-
726- ASSERT (!PreparingOverload);
727-
728728 // If the last path element is an archetype or associated type, ignore it.
729729 SmallVector<LocatorPathElt, 2 > pathElts;
730730 auto anchor = locator.getLocatorParts (pathElts);
@@ -746,7 +746,8 @@ void ConstraintSystem::recordOpenedTypes(
746746 // FIXME: Get rid of fixmeAllowDuplicates.
747747 if (!fixmeAllowDuplicates || OpenedTypes.count (locatorPtr) == 0 )
748748 recordOpenedType (
749- locatorPtr, llvm::ArrayRef (openedTypes, replacements.size ()));
749+ locatorPtr, llvm::ArrayRef (openedTypes, replacements.size ()),
750+ preparedOverload);
750751}
751752
752753// / Determine how many levels of argument labels should be removed from the
@@ -2496,35 +2497,55 @@ void ConstraintSystem::recordResolvedOverload(ConstraintLocator *locator,
24962497
24972498void PreparedOverload::discharge (ConstraintSystem &cs,
24982499 ConstraintLocatorBuilder locator) const {
2499- for (auto *tv : TypeVariables) {
2500- cs.addTypeVariable (tv);
2501- }
2500+ for (auto change : Changes) {
2501+ switch (change.Kind ) {
2502+ case PreparedOverload::Change::AddedTypeVariable:
2503+ cs.addTypeVariable (change.TypeVar );
2504+ break ;
25022505
2503- for ( auto *c : Constraints) {
2504- cs.addUnsolvedConstraint (c );
2505- cs.activateConstraint (c );
2506- }
2506+ case PreparedOverload::Change::AddedConstraint:
2507+ cs.addUnsolvedConstraint (change. TheConstraint );
2508+ cs.activateConstraint (change. TheConstraint );
2509+ break ;
25072510
2508- cs.recordOpenedTypes (locator, Replacements);
2511+ case PreparedOverload::Change::OpenedTypes: {
2512+ auto *locatorPtr = cs.getConstraintLocator (locator);
2513+ ArrayRef<OpenedType> replacements (
2514+ change.Replacements .Data ,
2515+ change.Replacements .Count );
25092516
2510- if (OpenedExistential) {
2511- cs.recordOpenedExistentialType (cs.getConstraintLocator (locator),
2512- OpenedExistential);
2513- }
2517+ // FIXME: Get rid of this conditional.
2518+ if (cs.getOpenedTypes (locatorPtr).empty ())
2519+ cs.recordOpenedType (locatorPtr, replacements);
2520+ break ;
2521+ }
25142522
2515- for (auto pair : OpenedPackExpansionTypes) {
2516- cs.recordOpenedPackExpansionType (pair.first , pair.second );
2517- }
2523+ case PreparedOverload::Change::OpenedExistentialType: {
2524+ auto *locatorPtr = cs.getConstraintLocator (locator);
2525+ cs.recordOpenedExistentialType (locatorPtr,
2526+ change.TheExistential );
2527+ break ;
2528+ }
2529+
2530+ case PreparedOverload::Change::OpenedPackExpansionType:
2531+ cs.recordOpenedPackExpansionType (
2532+ change.PackExpansion .TheExpansion ,
2533+ change.PackExpansion .TypeVar );
2534+ break ;
25182535
2519- if (!PropertyWrappers.empty ()) {
2520- Expr *anchor = getAsExpr (cs.getConstraintLocator (locator)->getAnchor ());
2521- for (auto applied : PropertyWrappers) {
2522- cs.applyPropertyWrapper (anchor, applied);
2536+ case PreparedOverload::Change::AppliedPropertyWrapper: {
2537+ auto *locatorPtr = cs.getConstraintLocator (locator);
2538+ Expr *anchor = getAsExpr (locatorPtr->getAnchor ());
2539+ cs.applyPropertyWrapper (anchor,
2540+ { Type (change.PropertyWrapper .WrapperType ),
2541+ change.PropertyWrapper .InitKind });
2542+ break ;
25232543 }
2524- }
25252544
2526- for (auto pair : Fixes) {
2527- cs.recordFix (pair.first , pair.second );
2545+ case PreparedOverload::Change::AddedFix:
2546+ cs.recordFix (change.Fix .TheFix , change.Fix .Impact );
2547+ break ;
2548+ }
25282549 }
25292550}
25302551
0 commit comments