@@ -1629,13 +1629,12 @@ static bool isOperatorBindOverload(Constraint *bindOverload) {
1629
1629
// Given a bind overload constraint for an operator, return the
1630
1630
// protocol designated as the first place to look for overloads of the
1631
1631
// operator.
1632
- static NominalTypeDecl *
1633
- getOperatorDesignatedNominalType (Constraint *bindOverload) {
1632
+ static ArrayRef< NominalTypeDecl *>
1633
+ getOperatorDesignatedNominalTypes (Constraint *bindOverload) {
1634
1634
auto choice = bindOverload->getOverloadChoice ();
1635
1635
auto *funcDecl = cast<FuncDecl>(choice.getDecl ());
1636
1636
auto *operatorDecl = funcDecl->getOperatorDecl ();
1637
- auto designatedTypes = operatorDecl->getDesignatedNominalTypes ();
1638
- return !designatedTypes.empty () ? designatedTypes[0 ] : nullptr ;
1637
+ return operatorDecl->getDesignatedNominalTypes ();
1639
1638
}
1640
1639
1641
1640
void ConstraintSystem::partitionDisjunction (
@@ -1660,8 +1659,8 @@ void ConstraintSystem::partitionDisjunction(
1660
1659
SmallVector<unsigned , 4 > disabled;
1661
1660
SmallVector<unsigned , 4 > unavailable;
1662
1661
SmallVector<unsigned , 4 > globalScope;
1663
- SmallVector<unsigned , 4 > definedInDesignatedType;
1664
- SmallVector<unsigned , 4 > definedInExtensionOfDesignatedType;
1662
+ SmallVector<SmallVector< unsigned , 4 > , 4 > definedInDesignatedType;
1663
+ SmallVector<SmallVector< unsigned , 4 > , 4 > definedInExtensionOfDesignatedType;
1665
1664
SmallVector<unsigned , 4 > everythingElse;
1666
1665
SmallSet<Constraint *, 16 > taken;
1667
1666
@@ -1722,28 +1721,43 @@ void ConstraintSystem::partitionDisjunction(
1722
1721
1723
1722
// Now collect the overload choices that are defined within the type
1724
1723
// that was designated in the operator declaration.
1725
- auto *designatedNominal = getOperatorDesignatedNominalType (Choices[0 ]);
1726
- if (designatedNominal) {
1727
- forEachChoice (Choices, [&](unsigned index, Constraint *constraint) -> bool {
1728
- auto *decl = constraint->getOverloadChoice ().getDecl ();
1729
- auto *funcDecl = cast<FuncDecl>(decl);
1730
-
1731
- auto *parentDecl = funcDecl->getParent ()->getAsDecl ();
1732
- if (parentDecl == designatedNominal) {
1733
- definedInDesignatedType.push_back (index);
1734
- return true ;
1735
- }
1724
+ auto designatedNominalTypes = getOperatorDesignatedNominalTypes (Choices[0 ]);
1725
+ if (!designatedNominalTypes.empty ()) {
1726
+ forEachChoice (
1727
+ Choices, [&](unsigned constraintIndex, Constraint *constraint) -> bool {
1728
+ auto *decl = constraint->getOverloadChoice ().getDecl ();
1729
+ auto *funcDecl = cast<FuncDecl>(decl);
1730
+
1731
+ auto *parentDecl = funcDecl->getParent ()->getAsDecl ();
1732
+ for (auto designatedTypeIndex : indices (designatedNominalTypes)) {
1733
+ auto *designatedNominal =
1734
+ designatedNominalTypes[designatedTypeIndex];
1735
+ if (parentDecl == designatedNominal) {
1736
+ if (designatedTypeIndex >= definedInDesignatedType.size ())
1737
+ definedInDesignatedType.resize (designatedTypeIndex + 1 );
1738
+ auto &constraints = definedInDesignatedType[designatedTypeIndex];
1739
+ constraints.push_back (constraintIndex);
1740
+ return true ;
1741
+ }
1736
1742
1737
- if (auto *extensionDecl = dyn_cast<ExtensionDecl>(parentDecl)) {
1738
- parentDecl = extensionDecl->getExtendedNominal ();
1739
- if (parentDecl == designatedNominal) {
1740
- definedInExtensionOfDesignatedType.push_back (index);
1741
- return true ;
1743
+ if (auto *extensionDecl = dyn_cast<ExtensionDecl>(parentDecl)) {
1744
+ parentDecl = extensionDecl->getExtendedNominal ();
1745
+ if (parentDecl == designatedNominal) {
1746
+ if (designatedTypeIndex >=
1747
+ definedInExtensionOfDesignatedType.size ())
1748
+ definedInExtensionOfDesignatedType.resize (
1749
+ designatedTypeIndex + 1 );
1750
+
1751
+ auto &constraints =
1752
+ definedInExtensionOfDesignatedType[designatedTypeIndex];
1753
+ constraints.push_back (constraintIndex);
1754
+ return true ;
1755
+ }
1756
+ }
1742
1757
}
1743
- }
1744
1758
1745
- return false ;
1746
- });
1759
+ return false ;
1760
+ });
1747
1761
}
1748
1762
1749
1763
// Gather the remaining options.
@@ -1762,8 +1776,19 @@ void ConstraintSystem::partitionDisjunction(
1762
1776
};
1763
1777
1764
1778
// Now create the partitioning based on what was collected.
1765
- appendPartition (definedInDesignatedType);
1766
- appendPartition (definedInExtensionOfDesignatedType);
1779
+
1780
+ // First we'll add partitions for each of the overloads we found in
1781
+ // types that were designated as part of the operator declaration.
1782
+ for (auto designatedTypeIndex : indices (designatedNominalTypes)) {
1783
+ if (designatedTypeIndex < definedInDesignatedType.size ()) {
1784
+ auto &primary = definedInDesignatedType[designatedTypeIndex];
1785
+ appendPartition (primary);
1786
+ }
1787
+ if (designatedTypeIndex < definedInExtensionOfDesignatedType.size ()) {
1788
+ auto &secondary = definedInExtensionOfDesignatedType[designatedTypeIndex];
1789
+ appendPartition (secondary);
1790
+ }
1791
+ }
1767
1792
appendPartition (everythingElse);
1768
1793
appendPartition (globalScope);
1769
1794
appendPartition (unavailable);
0 commit comments