Skip to content

Commit

Permalink
Rollup merge of #103746 - notriddle:notriddle/incoherent-dyn-trait, r…
Browse files Browse the repository at this point in the history
…=GuillaumeGomez

rustdoc: add support for incoherent impls on structs and traits

Fixes #103170
  • Loading branch information
notriddle authored Oct 31, 2022
2 parents 16ca462 + 3195388 commit c61a32a
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 0 deletions.
15 changes: 15 additions & 0 deletions src/librustdoc/clean/inline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,21 @@ pub(crate) fn build_impls(
for &did in tcx.inherent_impls(did).iter() {
build_impl(cx, parent_module, did, attrs, ret);
}

// This pretty much exists expressly for `dyn Error` traits that exist in the `alloc` crate.
// See also:
//
// * https://github.com/rust-lang/rust/issues/103170 — where it didn't used to get documented
// * https://github.com/rust-lang/rust/pull/99917 — where the feature got used
// * https://github.com/rust-lang/rust/issues/53487 — overall tracking issue for Error
if tcx.has_attr(did, sym::rustc_has_incoherent_inherent_impls) {
use rustc_middle::ty::fast_reject::SimplifiedTypeGen::*;
let type_ =
if tcx.is_trait(did) { TraitSimplifiedType(did) } else { AdtSimplifiedType(did) };
for &did in tcx.incoherent_impls(type_) {
build_impl(cx, parent_module, did, attrs, ret);
}
}
}

/// `parent_module` refers to the parent of the re-export, not the original item
Expand Down
7 changes: 7 additions & 0 deletions src/test/rustdoc/auxiliary/incoherent-impl-types.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#![feature(rustc_attrs)]

#[rustc_has_incoherent_inherent_impls]
pub trait FooTrait {}

#[rustc_has_incoherent_inherent_impls]
pub struct FooStruct;
28 changes: 28 additions & 0 deletions src/test/rustdoc/rustc-incoherent-impls.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// aux-build:incoherent-impl-types.rs
// build-aux-docs

#![crate_name = "foo"]
#![feature(rustc_attrs)]

extern crate incoherent_impl_types;

// The only way this actually shows up is if the type gets inlined.
#[doc(inline)]
pub use incoherent_impl_types::FooTrait;

// @has foo/trait.FooTrait.html
// @count - '//section[@id="method.do_something"]' 1
impl dyn FooTrait {
#[rustc_allow_incoherent_impl]
pub fn do_something() {}
}

#[doc(inline)]
pub use incoherent_impl_types::FooStruct;

// @has foo/struct.FooStruct.html
// @count - '//section[@id="method.do_something"]' 1
impl FooStruct {
#[rustc_allow_incoherent_impl]
pub fn do_something() {}
}

0 comments on commit c61a32a

Please sign in to comment.