Skip to content

Commit

Permalink
only store valid proc marco item for doc link
Browse files Browse the repository at this point in the history
  • Loading branch information
bvanjoi committed Nov 22, 2024
1 parent b19329a commit 961ec90
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 15 deletions.
32 changes: 17 additions & 15 deletions compiler/rustc_resolve/src/late.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4794,14 +4794,10 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
let res = self.r.resolve_rustdoc_path(path.as_str(), *ns, self.parent_scope);
if let Some(res) = res
&& let Some(def_id) = res.opt_def_id()
&& !def_id.is_local()
&& self.r.tcx.crate_types().contains(&CrateType::ProcMacro)
&& matches!(
self.r.tcx.sess.opts.resolve_doc_links,
ResolveDocLinks::ExportedMetadata
)
&& self.is_invalid_proc_macro_item_for_doc(def_id)
{
// Encoding foreign def ids in proc macro crate metadata will ICE.
// Encoding def ids in proc macro crate metadata will ICE,
// because it will only store proc macros for it.
return None;
}
res
Expand All @@ -4810,6 +4806,17 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
res
}

fn is_invalid_proc_macro_item_for_doc(&self, did: DefId) -> bool {
if !self.r.tcx.crate_types().contains(&CrateType::ProcMacro)
|| !matches!(self.r.tcx.sess.opts.resolve_doc_links, ResolveDocLinks::ExportedMetadata)
{
return false;
}
let Some(local_did) = did.as_local() else { return true };
let Some(node_id) = self.r.def_id_to_node_id.get(local_did) else { return true };
!self.r.proc_macros.contains(node_id)
}

fn resolve_doc_links(&mut self, attrs: &[Attribute], maybe_exported: MaybeExported<'_>) {
match self.r.tcx.sess.opts.resolve_doc_links {
ResolveDocLinks::None => return,
Expand Down Expand Up @@ -4872,14 +4879,9 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
.traits_in_scope(None, &self.parent_scope, SyntaxContext::root(), None)
.into_iter()
.filter_map(|tr| {
if !tr.def_id.is_local()
&& self.r.tcx.crate_types().contains(&CrateType::ProcMacro)
&& matches!(
self.r.tcx.sess.opts.resolve_doc_links,
ResolveDocLinks::ExportedMetadata
)
{
// Encoding foreign def ids in proc macro crate metadata will ICE.
if self.is_invalid_proc_macro_item_for_doc(tr.def_id) {
// Encoding def ids in proc macro crate metadata will ICE.
// because it will only store proc macros for it.
return None;
}
Some(tr.def_id)
Expand Down
20 changes: 20 additions & 0 deletions tests/rustdoc-ui/intra-doc/auxiliary/in-proc-item-comment.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//@ force-host
//@ no-prefer-dynamic
#![crate_type = "proc-macro"]

extern crate proc_macro;
use proc_macro::TokenStream;

mod view {}

/// [`view`]
#[proc_macro]
pub fn f(_: TokenStream) -> TokenStream {
todo!()
}

/// [`f()`]
#[proc_macro]
pub fn g(_: TokenStream) -> TokenStream {
todo!()
}
8 changes: 8 additions & 0 deletions tests/rustdoc-ui/intra-doc/pub-prco-item.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
//@ aux-build:in-proc-item-comment.rs
//@ check-pass

// issue#132743

extern crate in_proc_item_comment;

pub use in_proc_item_comment::{f, g};

0 comments on commit 961ec90

Please sign in to comment.