Skip to content

Commit

Permalink
Rollup merge of #103120 - petrochenkov:docice, r=GuillaumeGomez
Browse files Browse the repository at this point in the history
rustdoc: Do not expect `doc(primitive)` modules to always exist

The second commit fixes one more ICE by processing impls in crates loaded through the "load all `--extern`s" hack.

Fixes #96288
Fixes #103028
  • Loading branch information
matthiaskrgr authored Oct 16, 2022
2 parents 0602d64 + dd7411d commit db30a25
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 6 deletions.
10 changes: 5 additions & 5 deletions src/librustdoc/passes/collect_intra_doc_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,10 @@ impl Res {
}
}

fn def_id(self, tcx: TyCtxt<'_>) -> DefId {
fn def_id(self, tcx: TyCtxt<'_>) -> Option<DefId> {
match self {
Res::Def(_, id) => id,
Res::Primitive(prim) => *PrimitiveType::primitive_locations(tcx).get(&prim).unwrap(),
Res::Def(_, id) => Some(id),
Res::Primitive(prim) => PrimitiveType::primitive_locations(tcx).get(&prim).copied(),
}
}

Expand Down Expand Up @@ -1127,10 +1127,10 @@ impl LinkCollector<'_, '_> {
}
}

Some(ItemLink {
res.def_id(self.cx.tcx).map(|page_id| ItemLink {
link: ori_link.link.clone(),
link_text: link_text.clone(),
page_id: res.def_id(self.cx.tcx),
page_id,
fragment,
})
}
Expand Down
3 changes: 2 additions & 1 deletion src/librustdoc/passes/collect_intra_doc_links/early.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ pub(crate) fn early_resolve_intra_doc_links(
link_resolver.resolve_doc_links_local(&krate.attrs);
link_resolver.process_module_children_or_reexports(CRATE_DEF_ID.to_def_id());
visit::walk_crate(&mut link_resolver, krate);
link_resolver.process_extern_impls();

// FIXME: somehow rustdoc is still missing crates even though we loaded all
// the known necessary crates. Load them all unconditionally until we find a way to fix this.
Expand All @@ -58,6 +57,8 @@ pub(crate) fn early_resolve_intra_doc_links(
link_resolver.resolver.resolve_rustdoc_path(extern_name, TypeNS, parent_scope);
}

link_resolver.process_extern_impls();

ResolverCaches {
markdown_links: Some(link_resolver.markdown_links),
doc_link_resolutions: link_resolver.doc_link_resolutions,
Expand Down
15 changes: 15 additions & 0 deletions src/test/rustdoc/intra-doc/no-doc-primitive.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Crate tree without a `doc(primitive)` module for primitive type linked to by a doc link.

#![deny(rustdoc::broken_intra_doc_links)]
#![feature(no_core, lang_items, rustc_attrs)]
#![no_core]
#![rustc_coherence_is_core]
#![crate_type = "rlib"]

// @has no_doc_primitive/index.html
//! A [`char`] and its [`char::len_utf8`].
impl char {
pub fn len_utf8(self) -> usize {
42
}
}

0 comments on commit db30a25

Please sign in to comment.