@@ -3,7 +3,7 @@ |
|
|
3 |
3 |
use hir::{ |
4 |
4 |
db::HirDatabase, AsAssocItem, AssocItem, AssocItemContainer, Crate, HasCrate, ImportPathConfig, |
5 |
5 |
ItemInNs, ModPath, Module, ModuleDef, Name, PathResolution, PrefixKind, ScopeDef, Semantics, |
6 |
|
-SemanticsScope, Trait, Type, |
|
6 |
+SemanticsScope, Trait, TyFingerprint, Type, |
7 |
7 |
}; |
8 |
8 |
use itertools::{EitherOrBoth, Itertools}; |
9 |
9 |
use rustc_hash::{FxHashMap, FxHashSet}; |
@@ -545,6 +545,15 @@ fn trait_applicable_items( |
|
|
545 |
545 |
let Some(receiver) = trait_candidate.receiver_ty.fingerprint_for_trait_impl() else { |
546 |
546 |
return false; |
547 |
547 |
}; |
|
548 |
+ |
|
549 |
+// in order to handle implied bounds through an associated type, keep any |
|
550 |
+// method receiver that matches `TyFingerprint::Unnameable`. this receiver |
|
551 |
+// won't be in `TraitImpls` anyways, as `TraitImpls` only contains actual |
|
552 |
+// implementations. |
|
553 |
+if matches!(receiver, TyFingerprint::Unnameable) { |
|
554 |
+return true; |
|
555 |
+} |
|
556 |
+ |
548 |
557 |
let definitions_exist_in_trait_crate = db |
549 |
558 |
.trait_impls_in_crate(defining_crate_for_trait.into()) |
550 |
559 |
.has_impls_for_trait_and_self_ty(candidate_trait_id, receiver); |