mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-22 10:05:06 +03:00
bail out of selection when there are multiple surviving candidates
In some cases (e.g. <[int-var] as Add<[int-var]>>), selection can turn up a large number of candidates. Bailing out early avoids O(n^2) performance. This improves item-type checking time by quite a bit, resulting in ~2% of total time-to-typeck.
This commit is contained in:
committed by
Ariel Ben-Yehuda
parent
a0f145ba8c
commit
a660ad84b3
@@ -943,17 +943,17 @@ fn candidate_from_obligation_no_cache<'o>(&mut self,
|
||||
debug!("Retaining candidate #{}/{}: {:?}",
|
||||
i, candidates.len(), candidates[i]);
|
||||
i += 1;
|
||||
|
||||
// If there are *STILL* multiple candidates, give up
|
||||
// and report ambiguity.
|
||||
if i > 1 {
|
||||
debug!("multiple matches, ambig");
|
||||
return Ok(None);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If there are *STILL* multiple candidates, give up and
|
||||
// report ambiguity.
|
||||
if candidates.len() > 1 {
|
||||
debug!("multiple matches, ambig");
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
// If there are *NO* candidates, then there are no impls --
|
||||
// that we know of, anyway. Note that in the case where there
|
||||
// are unbound type variables within the obligation, it might
|
||||
|
||||
Reference in New Issue
Block a user