From c955f172b2f09f28d187ed7634e18861258833e5 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Fri, 1 Feb 2019 11:17:33 -0600 Subject: [PATCH] don't try to get a DefId for a Def that doesn't have one --- src/librustdoc/clean/inline.rs | 7 +++++-- src/librustdoc/clean/mod.rs | 2 +- src/librustdoc/visit_ast.rs | 7 ++++--- src/test/rustdoc/use-attr.rs | 8 ++++++++ 4 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 src/test/rustdoc/use-attr.rs diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 9cb21df713e5b..8c8151e1e9509 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -37,8 +37,11 @@ use super::Clean; /// and `Some` of a vector of items if it was successfully expanded. pub fn try_inline(cx: &DocContext, def: Def, name: ast::Name, visited: &mut FxHashSet) -> Option> { - if def == Def::Err { return None } - let did = def.def_id(); + let did = if let Some(did) = def.opt_def_id() { + did + } else { + return None; + }; if did.is_local() { return None } let mut ret = Vec::new(); let inner = match def { diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 6eea95b61c990..7d736d40b2547 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -3818,7 +3818,7 @@ pub fn register_def(cx: &DocContext, def: Def) -> DefId { fn resolve_use_source(cx: &DocContext, path: Path) -> ImportSource { ImportSource { - did: if path.def == Def::Err { + did: if path.def.opt_def_id().is_none() { None } else { Some(register_def(cx, path.def)) diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index 953ab7c2565bf..b8eb777a54ba4 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -284,10 +284,11 @@ impl<'a, 'tcx, 'rcx> RustdocVisitor<'a, 'tcx, 'rcx> { debug!("maybe_inline_local def: {:?}", def); let tcx = self.cx.tcx; - if def == Def::Err { + let def_did = if let Some(did) = def.opt_def_id() { + did + } else { return false; - } - let def_did = def.def_id(); + }; let use_attrs = tcx.hir().attrs(id); // Don't inline `doc(hidden)` imports so they can be stripped at a later stage. diff --git a/src/test/rustdoc/use-attr.rs b/src/test/rustdoc/use-attr.rs new file mode 100644 index 0000000000000..996b7bba62181 --- /dev/null +++ b/src/test/rustdoc/use-attr.rs @@ -0,0 +1,8 @@ +// edition:2018 + +// ICE when rustdoc encountered a use statement of a non-macro attribute (see #58054) + +// @has use_attr/index.html +// @has - '//code' 'pub use proc_macro_attribute' +pub use proc_macro_attribute; +use proc_macro_derive;