diff --git a/src/librustdoc/passes/collect_trait_impls.rs b/src/librustdoc/passes/collect_trait_impls.rs index 0271a5b78a7ef..bc90ac0818618 100644 --- a/src/librustdoc/passes/collect_trait_impls.rs +++ b/src/librustdoc/passes/collect_trait_impls.rs @@ -88,18 +88,29 @@ crate fn collect_trait_impls(krate: Crate, cx: &mut DocContext<'_>) -> Crate { let mut cleaner = BadImplStripper { prims, items: crate_items }; + let sized_trait = cx.tcx.lang_items().sized_trait(); + let deref_trait = cx.tcx.lang_items().deref_trait(); + let mut type_did_to_deref_target: FxHashMap = FxHashMap::default(); // Gather all type to `Deref` target edges. for it in &new_items { if let ImplItem(Impl { ref for_, ref trait_, ref items, .. }) = *it.kind { - if trait_.def_id() == cx.tcx.lang_items().deref_trait() { - let target = items.iter().find_map(|item| match *item.kind { - TypedefItem(ref t, true) => Some(&t.type_), - _ => None, - }); - if let (Some(for_did), Some(target)) = (for_.def_id(), target) { - type_did_to_deref_target.insert(for_did, target); + match trait_.def_id() { + did if sized_trait == did => {} + Some(did) => { + if Some(did) == deref_trait { + let target = items.iter().find_map(|item| match *item.kind { + TypedefItem(ref t, true) => Some(&t.type_), + _ => None, + }); + if let (Some(for_did), Some(target)) = (for_.def_id(), target) { + type_did_to_deref_target.insert(for_did, target); + } + } else { + cleaner.items.insert(did); + } } + _ => {} } } } diff --git a/src/test/rustdoc/impl-on-foreign.rs b/src/test/rustdoc/impl-on-foreign.rs new file mode 100644 index 0000000000000..2a638e16e5fa4 --- /dev/null +++ b/src/test/rustdoc/impl-on-foreign.rs @@ -0,0 +1,26 @@ +#![crate_name = "foo"] + +use std::convert::AsRef; +pub struct Gus; + +// @has 'foo/struct.Gus.html' +// @has - '//h3[@class="impl"]/code' 'impl AsRef for Gus' +impl AsRef for Gus { + fn as_ref(&self) -> &str { + todo!() + } +} + +// @has - '//h3[@class="impl"]/code' 'impl AsRef for str' +impl AsRef for str { + fn as_ref(&self) -> &Gus { + todo!() + } +} + +// @has - '//h3[@class="impl"]/code' 'impl AsRef for String' +impl AsRef for String { + fn as_ref(&self) -> &Gus { + todo!() + } +}