@@ -1672,13 +1672,12 @@ static bool isOperatorBindOverload(Constraint *bindOverload) {
1672
1672
// Given a bind overload constraint for an operator, return the
1673
1673
// protocol designated as the first place to look for overloads of the
1674
1674
// operator.
1675
- static NominalTypeDecl *
1676
- getOperatorDesignatedNominalType (Constraint *bindOverload) {
1675
+ static ArrayRef< NominalTypeDecl *>
1676
+ getOperatorDesignatedNominalTypes (Constraint *bindOverload) {
1677
1677
auto choice = bindOverload->getOverloadChoice ();
1678
1678
auto *funcDecl = cast<FuncDecl>(choice.getDecl ());
1679
1679
auto *operatorDecl = funcDecl->getOperatorDecl ();
1680
- auto designatedTypes = operatorDecl->getDesignatedNominalTypes ();
1681
- return !designatedTypes.empty () ? designatedTypes[0 ] : nullptr ;
1680
+ return operatorDecl->getDesignatedNominalTypes ();
1682
1681
}
1683
1682
1684
1683
void ConstraintSystem::partitionDisjunction (
@@ -1703,8 +1702,8 @@ void ConstraintSystem::partitionDisjunction(
1703
1702
SmallVector<unsigned , 4 > disabled;
1704
1703
SmallVector<unsigned , 4 > unavailable;
1705
1704
SmallVector<unsigned , 4 > globalScope;
1706
- SmallVector<unsigned , 4 > definedInDesignatedType;
1707
- SmallVector<unsigned , 4 > definedInExtensionOfDesignatedType;
1705
+ SmallVector<SmallVector< unsigned , 4 > , 4 > definedInDesignatedType;
1706
+ SmallVector<SmallVector< unsigned , 4 > , 4 > definedInExtensionOfDesignatedType;
1708
1707
SmallVector<unsigned , 4 > everythingElse;
1709
1708
SmallSet<Constraint *, 16 > taken;
1710
1709
@@ -1765,28 +1764,43 @@ void ConstraintSystem::partitionDisjunction(
1765
1764
1766
1765
// Now collect the overload choices that are defined within the type
1767
1766
// that was designated in the operator declaration.
1768
- auto *designatedNominal = getOperatorDesignatedNominalType (Choices[0 ]);
1769
- if (designatedNominal) {
1770
- forEachChoice (Choices, [&](unsigned index, Constraint *constraint) -> bool {
1771
- auto *decl = constraint->getOverloadChoice ().getDecl ();
1772
- auto *funcDecl = cast<FuncDecl>(decl);
1773
-
1774
- auto *parentDecl = funcDecl->getParent ()->getAsDecl ();
1775
- if (parentDecl == designatedNominal) {
1776
- definedInDesignatedType.push_back (index);
1777
- return true ;
1778
- }
1767
+ auto designatedNominalTypes = getOperatorDesignatedNominalTypes (Choices[0 ]);
1768
+ if (!designatedNominalTypes.empty ()) {
1769
+ forEachChoice (
1770
+ Choices, [&](unsigned constraintIndex, Constraint *constraint) -> bool {
1771
+ auto *decl = constraint->getOverloadChoice ().getDecl ();
1772
+ auto *funcDecl = cast<FuncDecl>(decl);
1773
+
1774
+ auto *parentDecl = funcDecl->getParent ()->getAsDecl ();
1775
+ for (auto designatedTypeIndex : indices (designatedNominalTypes)) {
1776
+ auto *designatedNominal =
1777
+ designatedNominalTypes[designatedTypeIndex];
1778
+ if (parentDecl == designatedNominal) {
1779
+ if (designatedTypeIndex >= definedInDesignatedType.size ())
1780
+ definedInDesignatedType.resize (designatedTypeIndex + 1 );
1781
+ auto &constraints = definedInDesignatedType[designatedTypeIndex];
1782
+ constraints.push_back (constraintIndex);
1783
+ return true ;
1784
+ }
1779
1785
1780
- if (auto *extensionDecl = dyn_cast<ExtensionDecl>(parentDecl)) {
1781
- parentDecl = extensionDecl->getExtendedNominal ();
1782
- if (parentDecl == designatedNominal) {
1783
- definedInExtensionOfDesignatedType.push_back (index);
1784
- return true ;
1786
+ if (auto *extensionDecl = dyn_cast<ExtensionDecl>(parentDecl)) {
1787
+ parentDecl = extensionDecl->getExtendedNominal ();
1788
+ if (parentDecl == designatedNominal) {
1789
+ if (designatedTypeIndex >=
1790
+ definedInExtensionOfDesignatedType.size ())
1791
+ definedInExtensionOfDesignatedType.resize (
1792
+ designatedTypeIndex + 1 );
1793
+
1794
+ auto &constraints =
1795
+ definedInExtensionOfDesignatedType[designatedTypeIndex];
1796
+ constraints.push_back (constraintIndex);
1797
+ return true ;
1798
+ }
1799
+ }
1785
1800
}
1786
- }
1787
1801
1788
- return false ;
1789
- });
1802
+ return false ;
1803
+ });
1790
1804
}
1791
1805
1792
1806
// Gather the remaining options.
@@ -1805,8 +1819,19 @@ void ConstraintSystem::partitionDisjunction(
1805
1819
};
1806
1820
1807
1821
// Now create the partitioning based on what was collected.
1808
- appendPartition (definedInDesignatedType);
1809
- appendPartition (definedInExtensionOfDesignatedType);
1822
+
1823
+ // First we'll add partitions for each of the overloads we found in
1824
+ // types that were designated as part of the operator declaration.
1825
+ for (auto designatedTypeIndex : indices (designatedNominalTypes)) {
1826
+ if (designatedTypeIndex < definedInDesignatedType.size ()) {
1827
+ auto &primary = definedInDesignatedType[designatedTypeIndex];
1828
+ appendPartition (primary);
1829
+ }
1830
+ if (designatedTypeIndex < definedInExtensionOfDesignatedType.size ()) {
1831
+ auto &secondary = definedInExtensionOfDesignatedType[designatedTypeIndex];
1832
+ appendPartition (secondary);
1833
+ }
1834
+ }
1810
1835
appendPartition (everythingElse);
1811
1836
appendPartition (globalScope);
1812
1837
appendPartition (unavailable);
0 commit comments