Rollup merge of #103120 - petrochenkov:docice, r=GuillaumeGomez

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 https://github.com/rust-lang/rust/issues/96288
Fixes https://github.com/rust-lang/rust/issues/103028
This commit is contained in:
Matthias Krüger 2022-10-16 22:36:07 +02:00 committed by GitHub
commit db30a25781
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 6 deletions

View File

@ -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(),
}
}
@ -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,
})
}

View File

@ -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.
@ -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,

View File

@ -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
}
}