diff --git a/src/librustdoc/clean/utils.rs b/src/librustdoc/clean/utils.rs index ff4f5c115ffa..253d4dcf9f2a 100644 --- a/src/librustdoc/clean/utils.rs +++ b/src/librustdoc/clean/utils.rs @@ -351,8 +351,10 @@ fn print_pat(pat: &Pat<'_>, wild: bool) -> impl Display { pub(crate) fn print_const(tcx: TyCtxt<'_>, n: ty::Const<'_>) -> String { match n.kind() { ty::ConstKind::Unevaluated(ty::UnevaluatedConst { def, args: _ }) => { - if let Some(def) = def.as_local() { - rendered_const(tcx, tcx.hir_body_owned_by(def), def) + if let Some(def) = def.as_local() + && let Some(body_id) = tcx.hir_maybe_body_owned_by(def) + { + rendered_const(tcx, body_id, def) } else { inline::print_inlined_const(tcx, def) } diff --git a/tests/rustdoc-ui/type-const-associated-const-no-body.rs b/tests/rustdoc-ui/type-const-associated-const-no-body.rs new file mode 100644 index 000000000000..66a60c7fc724 --- /dev/null +++ b/tests/rustdoc-ui/type-const-associated-const-no-body.rs @@ -0,0 +1,16 @@ +//! Regression test for +//! Ensure that rustdoc does not ICE when a body-less type const is used +//! as an associated const. +//@ check-pass + +#![feature(min_generic_const_args)] + +pub trait Tr { + type const SIZE: usize; +} + +fn mk_array() -> [(); ::SIZE] { + [(); T::SIZE] +} + +fn main() {}