Skip to content

Commit

Permalink
Rollup merge of rust-lang#92860 - CraftSpider:rustdoc-json-impl-ice, …
Browse files Browse the repository at this point in the history
…r=jsha

Fix errors on blanket impls by ignoring the children of generated impls

Related to rust-lang#83718

We can safely skip the children, as they don't contain any new info, and may be subtly different for reasons hard to track down, in ways that are consistently worse than the actual generic impl.
  • Loading branch information
matthiaskrgr authored Jan 20, 2022
2 parents 10a7204 + 474e091 commit 530c884
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
15 changes: 14 additions & 1 deletion src/librustdoc/json/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -171,8 +171,21 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> {
/// the hashmap because certain items (traits and types) need to have their mappings for trait
/// implementations filled out before they're inserted.
fn item(&mut self, item: clean::Item) -> Result<(), Error> {
let local_blanket_impl = match item.def_id {
clean::ItemId::Blanket { impl_id, .. } => impl_id.is_local(),
clean::ItemId::Auto { .. }
| clean::ItemId::DefId(_)
| clean::ItemId::Primitive(_, _) => false,
};

// Flatten items that recursively store other items
item.kind.inner_items().for_each(|i| self.item(i.clone()).unwrap());
// FIXME(CraftSpider): We skip children of local blanket implementations, as we'll have
// already seen the actual generic impl, and the generated ones don't need documenting.
// This is necessary due to the visibility, return type, and self arg of the generated
// impls not quite matching, and will no longer be necessary when the mismatch is fixed.
if !local_blanket_impl {
item.kind.inner_items().for_each(|i| self.item(i.clone()).unwrap());
}

let id = item.def_id;
if let Some(mut new_item) = self.convert_item(item) {
Expand Down
14 changes: 14 additions & 0 deletions src/test/rustdoc-json/impls/blanket_with_local.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Test for the ICE in rust/83718
// A blanket impl plus a local type together shouldn't result in mismatched ID issues

// @has blanket_with_local.json "$.index[*][?(@.name=='Load')]"
pub trait Load {
fn load() {}
}

impl<P> Load for P {
fn load() {}
}

// @has - "$.index[*][?(@.name=='Wrapper')]"
pub struct Wrapper {}

0 comments on commit 530c884

Please sign in to comment.