Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/method_resolution/probe.rs')
-rw-r--r--crates/hir-ty/src/method_resolution/probe.rs14
1 files changed, 12 insertions, 2 deletions
diff --git a/crates/hir-ty/src/method_resolution/probe.rs b/crates/hir-ty/src/method_resolution/probe.rs
index 4b2f0cfd70..84edb51023 100644
--- a/crates/hir-ty/src/method_resolution/probe.rs
+++ b/crates/hir-ty/src/method_resolution/probe.rs
@@ -3,6 +3,7 @@
use std::{cell::RefCell, convert::Infallible, ops::ControlFlow};
+use base_db::FxIndexMap;
use hir_def::{
AssocItemId, FunctionId, GenericParamId, ImplId, ItemContainerId, TraitId,
hir::generics::GenericParams,
@@ -10,7 +11,7 @@ use hir_def::{
};
use hir_expand::name::Name;
use rustc_ast_ir::Mutability;
-use rustc_hash::{FxHashMap, FxHashSet};
+use rustc_hash::FxHashSet;
use rustc_type_ir::{
InferTy, TypeVisitableExt, Upcast, Variance,
elaborate::{self, supertrait_def_ids},
@@ -719,7 +720,7 @@ impl<'db> ProbeChoice<'db> for ProbeForNameChoice<'db> {
#[derive(Debug)]
struct ProbeAllChoice<'db> {
- candidates: RefCell<FxHashMap<CandidateId, CandidateWithPrivate<'db>>>,
+ candidates: RefCell<FxIndexMap<CandidateId, CandidateWithPrivate<'db>>>,
considering_visible_candidates: bool,
}
@@ -1294,6 +1295,15 @@ impl<'a, 'db, Choice: ProbeChoice<'db>> ProbeContext<'a, 'db, Choice> {
return ControlFlow::Break(by_value_pick);
}
+ if self.mode == Mode::Path {
+ // Don't autoref in path mode.
+ // rustc doesn't do that and it's not a big deal as non-autorefd methods take priority
+ // and if an autorefd one is selected, we'll register the `NonAutorefdT: Trait` obligation
+ // (which will fail) anyway. But it does have an impact when probing for all methods,
+ // which is something we need to stay accurate.
+ return ControlFlow::Continue(());
+ }
+
let autoref_pick = self.pick_autorefd_method(
step,
self_ty,