@@ -2027,15 +2027,26 @@ static Constraint *tryOptimizeGenericDisjunction(
2027
2027
TypeChecker &tc,
2028
2028
DeclContext *dc,
2029
2029
ArrayRef<Constraint *> constraints) {
2030
- if (constraints.size () != 2 ||
2031
- constraints[0 ]->getKind () != ConstraintKind::BindOverload ||
2032
- constraints[1 ]->getKind () != ConstraintKind::BindOverload ||
2033
- constraints[0 ]->isFavored () ||
2034
- constraints[1 ]->isFavored ())
2030
+ llvm::SmallVector<Constraint *, 4 > choices;
2031
+ for (auto *choice : constraints) {
2032
+ if (choices.size () > 2 )
2033
+ return nullptr ;
2034
+
2035
+ if (!choice->isDisabled ())
2036
+ choices.push_back (choice);
2037
+ }
2038
+
2039
+ if (choices.size () != 2 )
2040
+ return nullptr ;
2041
+
2042
+ if (choices[0 ]->getKind () != ConstraintKind::BindOverload ||
2043
+ choices[1 ]->getKind () != ConstraintKind::BindOverload ||
2044
+ choices[0 ]->isFavored () ||
2045
+ choices[1 ]->isFavored ())
2035
2046
return nullptr ;
2036
2047
2037
- OverloadChoice choiceA = constraints [0 ]->getOverloadChoice ();
2038
- OverloadChoice choiceB = constraints [1 ]->getOverloadChoice ();
2048
+ OverloadChoice choiceA = choices [0 ]->getOverloadChoice ();
2049
+ OverloadChoice choiceB = choices [1 ]->getOverloadChoice ();
2039
2050
2040
2051
if (!choiceA.isDecl () || !choiceB.isDecl ())
2041
2052
return nullptr ;
@@ -2072,10 +2083,10 @@ static Constraint *tryOptimizeGenericDisjunction(
2072
2083
2073
2084
switch (tc.compareDeclarations (dc, declA, declB)) {
2074
2085
case Comparison::Better:
2075
- return constraints [0 ];
2086
+ return choices [0 ];
2076
2087
2077
2088
case Comparison::Worse:
2078
- return constraints [1 ];
2089
+ return choices [1 ];
2079
2090
2080
2091
case Comparison::Unordered:
2081
2092
return nullptr ;
0 commit comments