Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/ci/channel
Original file line number Diff line number Diff line change
@@ -1 +1 @@
beta
stable
15 changes: 15 additions & 0 deletions src/librustdoc/clean/inline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,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() {}
}