diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs index 49a8c077188dd..8385e691ed385 100644 --- a/src/librustdoc/html/render/print_item.rs +++ b/src/librustdoc/html/render/print_item.rs @@ -628,7 +628,11 @@ fn item_trait(cx: &Context<'_>, it: &clean::Item, t: &clean::Trait) -> impl fmt: let count_types = required_types.len() + provided_types.len(); let count_consts = required_consts.len() + provided_consts.len(); let count_methods = required_methods.len() + provided_methods.len(); - let must_implement_one_of_functions = &tcx.trait_def(t.def_id).must_implement_one_of; + let &rustc_middle::ty::TraitDef { + must_implement_one_of: ref must_implement_one_of_functions, + impl_restriction, + .. + } = tcx.trait_def(t.def_id); // Output the trait definition wrap_item(w, |mut w| { @@ -782,6 +786,25 @@ fn item_trait(cx: &Context<'_>, it: &clean::Item, t: &clean::Trait) -> impl fmt: // Trait documentation write!(w, "{}", document(cx, it, None, HeadingOffset::H2))?; + if let rustc_middle::ty::trait_def::ImplRestrictionKind::Restricted(def_id, _) = + impl_restriction + { + let v1; + let v2; + write!( + w, + "
This trait cannot be implemented outside {}.
", + if cx.cache().document_private { + v1 = + rustc_middle::ty::print::with_resolve_crate_name!(tcx.def_path_str(def_id)); + v1.as_str() + } else { + v2 = tcx.crate_name(def_id.krate); + v2.as_str() + }, + )?; + } + fn trait_item(cx: &Context<'_>, m: &clean::Item, t: &clean::Item) -> impl fmt::Display { fmt::from_fn(|w| { let name = m.name.unwrap(); diff --git a/tests/rustdoc-html/impl/impl-restriction-document-private.rs b/tests/rustdoc-html/impl/impl-restriction-document-private.rs new file mode 100644 index 0000000000000..6ea55eff54cf6 --- /dev/null +++ b/tests/rustdoc-html/impl/impl-restriction-document-private.rs @@ -0,0 +1,15 @@ +//@ compile-flags: --document-private-items +#![crate_name = "c"] +#![feature(impl_restriction)] + +//@ matches c/trait.Foo.html '//*[@class="stab impl_restriction"]' \ +// 'This trait cannot be implemented outside c.$' +//@ has c/trait.Foo.html '//*[@class="stab impl_restriction"]//code' 'c' +pub impl(crate) trait Foo {} + +pub mod inner { + //@ matches c/inner/trait.Bar.html '//*[@class="stab impl_restriction"]' \ + // 'This trait cannot be implemented outside c::inner.$' + //@ has c/inner/trait.Bar.html '//*[@class="stab impl_restriction"]//code' 'c::inner' + pub impl(self) trait Bar {} +} diff --git a/tests/rustdoc-html/impl/impl-restriction.rs b/tests/rustdoc-html/impl/impl-restriction.rs new file mode 100644 index 0000000000000..11df67425f9b9 --- /dev/null +++ b/tests/rustdoc-html/impl/impl-restriction.rs @@ -0,0 +1,14 @@ +#![crate_name = "c"] +#![feature(impl_restriction)] + +//@ matches c/trait.Foo.html '//*[@class="stab impl_restriction"]' \ +// 'This trait cannot be implemented outside c.$' +//@ has c/trait.Foo.html '//*[@class="stab impl_restriction"]//code' 'c' +pub impl(crate) trait Foo {} + +pub mod inner { + //@ matches c/inner/trait.Bar.html '//*[@class="stab impl_restriction"]' \ + // 'This trait cannot be implemented outside c.$' + //@ has c/inner/trait.Bar.html '//*[@class="stab impl_restriction"]//code' 'c' + pub impl(self) trait Bar {} +}