diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 9464ac83870d9..fcf7366e2b457 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -124,6 +124,7 @@ impl<'a, 'tcx> Clean for visit_ast::RustdocVisitor<'a, 'tcx> { let mut r = cx.renderinfo.borrow_mut(); r.deref_trait_did = cx.tcx.lang_items.deref_trait(); r.deref_mut_trait_did = cx.tcx.lang_items.deref_mut_trait(); + r.owned_box_did = cx.tcx.lang_items.owned_box(); } let mut externs = Vec::new(); diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index a588460d467d2..0d9f98e05d2c2 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -262,6 +262,7 @@ pub struct Cache { stripped_mod: bool, deref_trait_did: Option, deref_mut_trait_did: Option, + owned_box_did: Option, // In rare case where a structure is defined in one module but implemented // in another, if the implementing module is parsed before defining module, @@ -280,6 +281,7 @@ pub struct RenderInfo { pub external_typarams: FxHashMap, pub deref_trait_did: Option, pub deref_mut_trait_did: Option, + pub owned_box_did: Option, } /// Helper struct to render all source code to HTML pages @@ -507,6 +509,7 @@ pub fn run(mut krate: clean::Crate, external_typarams, deref_trait_did, deref_mut_trait_did, + owned_box_did, } = renderinfo; let external_paths = external_paths.into_iter() @@ -530,6 +533,7 @@ pub fn run(mut krate: clean::Crate, traits: mem::replace(&mut krate.external_traits, FxHashMap()), deref_trait_did: deref_trait_did, deref_mut_trait_did: deref_mut_trait_did, + owned_box_did: owned_box_did, typarams: external_typarams, }; @@ -2933,17 +2937,18 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi }; if let Some(self_ty) = self_type_opt { - let by_mut_ref = match self_ty { - SelfTy::SelfBorrowed(_lifetime, mutability) => { - mutability == Mutability::Mutable - }, + let (by_mut_ref, by_box) = match self_ty { + SelfTy::SelfBorrowed(_, mutability) | SelfTy::SelfExplicit(clean::BorrowedRef { mutability, .. }) => { - mutability == Mutability::Mutable + (mutability == Mutability::Mutable, false) + }, + SelfTy::SelfExplicit(clean::ResolvedPath { did, .. }) => { + (false, Some(did) == cache().owned_box_did) }, - _ => false, + _ => (false, false), }; - deref_mut_ || !by_mut_ref + (deref_mut_ || !by_mut_ref) && !by_box } else { false } diff --git a/src/test/rustdoc/issue-35169-2.rs b/src/test/rustdoc/issue-35169-2.rs index d738fb2925964..b19fbaa5b9535 100644 --- a/src/test/rustdoc/issue-35169-2.rs +++ b/src/test/rustdoc/issue-35169-2.rs @@ -19,6 +19,8 @@ impl Foo { pub fn by_explicit_ref(self: &Foo) {} pub fn by_mut_ref(&mut self) {} pub fn by_explicit_mut_ref(self: &mut Foo) {} + pub fn by_explicit_box(self: Box) {} + pub fn by_explicit_self_box(self: Box) {} pub fn static_foo() {} } @@ -41,5 +43,9 @@ impl DerefMut for Bar { // @has - '//*[@id="method.by_mut_ref"]' 'fn by_mut_ref(&mut self)' // @has - '//*[@id="by_explicit_mut_ref.v"]' 'fn by_explicit_mut_ref(self: &mut Foo)' // @has - '//*[@id="method.by_explicit_mut_ref"]' 'fn by_explicit_mut_ref(self: &mut Foo)' +// @!has - '//*[@id="by_explicit_box.v"]' 'fn by_explicit_box(self: Box)' +// @!has - '//*[@id="method.by_explicit_box"]' 'fn by_explicit_box(self: Box)' +// @!has - '//*[@id="by_explicit_self_box.v"]' 'fn by_explicit_self_box(self: Box)' +// @!has - '//*[@id="method.by_explicit_self_box"]' 'fn by_explicit_self_box(self: Box)' // @!has - '//*[@id="static_foo.v"]' 'fn static_foo()' // @!has - '//*[@id="method.static_foo"]' 'fn static_foo()' diff --git a/src/test/rustdoc/issue-35169.rs b/src/test/rustdoc/issue-35169.rs index 8764e4a390f76..95231f282e3ed 100644 --- a/src/test/rustdoc/issue-35169.rs +++ b/src/test/rustdoc/issue-35169.rs @@ -18,6 +18,8 @@ impl Foo { pub fn by_explicit_ref(self: &Foo) {} pub fn by_mut_ref(&mut self) {} pub fn by_explicit_mut_ref(self: &mut Foo) {} + pub fn by_explicit_box(self: Box) {} + pub fn by_explicit_self_box(self: Box) {} pub fn static_foo() {} } @@ -36,5 +38,9 @@ impl Deref for Bar { // @!has - '//*[@id="method.by_mut_ref"]' 'fn by_mut_ref(&mut self)' // @!has - '//*[@id="by_explicit_mut_ref.v"]' 'fn by_explicit_mut_ref(self: &mut Foo)' // @!has - '//*[@id="method.by_explicit_mut_ref"]' 'fn by_explicit_mut_ref(self: &mut Foo)' +// @!has - '//*[@id="by_explicit_box.v"]' 'fn by_explicit_box(self: Box)' +// @!has - '//*[@id="method.by_explicit_box"]' 'fn by_explicit_box(self: Box)' +// @!has - '//*[@id="by_explicit_self_box.v"]' 'fn by_explicit_self_box(self: Box)' +// @!has - '//*[@id="method.by_explicit_self_box"]' 'fn by_explicit_self_box(self: Box)' // @!has - '//*[@id="static_foo.v"]' 'fn static_foo()' // @!has - '//*[@id="method.static_foo"]' 'fn static_foo()'