diff options
| author | QuietMisdreavus <grey@quietmisdreavus.net> | 2019-02-01 11:17:33 -0600 |
|---|---|---|
| committer | QuietMisdreavus <grey@quietmisdreavus.net> | 2019-02-01 11:17:33 -0600 |
| commit | c955f172b2f09f28d187ed7634e18861258833e5 (patch) | |
| tree | c062f78f9ffd07120cc86239a553c37d65cbaa04 | |
| parent | 1aa250635e9fd2646116726c88a31c15eb4ab74e (diff) | |
| download | rust-c955f172b2f09f28d187ed7634e18861258833e5.tar.gz rust-c955f172b2f09f28d187ed7634e18861258833e5.zip | |
don't try to get a DefId for a Def that doesn't have one
| -rw-r--r-- | src/librustdoc/clean/inline.rs | 7 | ||||
| -rw-r--r-- | src/librustdoc/clean/mod.rs | 2 | ||||
| -rw-r--r-- | src/librustdoc/visit_ast.rs | 7 | ||||
| -rw-r--r-- | src/test/rustdoc/use-attr.rs | 8 |
4 files changed, 18 insertions, 6 deletions
diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 9cb21df713e..8c8151e1e95 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<DefId>) -> Option<Vec<clean::Item>> { - 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 6eea95b61c9..7d736d40b25 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 953ab7c2565..b8eb777a54b 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 00000000000..996b7bba621 --- /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; |
