Change:
Missing Implementors for [][1] trait. Current output: ! While rustdoc displays [][2] trait implementors. Expected: Display Implementors for Join trait: : 1.47.0-nightly ( 2020-08-15) [1]: [2]: modify labels: T-rustdoc
This is a regression from stable-to-nightly: and beta one has Implementors section. cc
It has made it way to beta. Pattern trait is also affected: modify labels: I-prioritize
(Btw I think you can use as a shorthand)
The Borrow trait still has , I am not sure if this bug affect crates in ecosystem.
So I think this bug shouldn't affect stable traits, just most unstable traits I saw are affected.
There is high change that causing the regression, but I cannot prove that.
This is more likely to be than the refactor I think.
Yeah, I suspect that given it might make sense to revert anyway, since it doesn't actually accomplish the goal. Or someone more experienced with rustdoc may be able to suggest/implement a better patch.
New discovery: So far only trait exported to std affected. For example with Join trait, in alloc it is normal:
Oh right, I have MCVE, it needs two dummy crates. <details<summarydummy crate "unstabled"</summary</detailsCrate to run : modify labels: -E-needs-mcve
searched nightlies: from nightly-2020-06-04 to nightly-2020-07-17 regressed nightly: nightly-2020-07-17 searched commits: from to regressed commit: <details<summarybisected with <a href=''cargo-bisect-rustc</av0.5.2</summaryHost triple: x86_64-unknown-linux-gnu Reproduce with: </details
That rollup includes both and ; of the two I think is the more likely culprit.
Marking as P-high .

Discussion:
// reachable in rustdoc generated documentation if !did.is_local() { if let Some(traitref) = associated_trait { <del> if !cx.renderinfo.borrow().access_levels.is_public(traitref.def_id) { </del> <ins> let did = traitref.def_id; if !cx.renderinfo.borrow().access_levels.is_public(did) { </ins> return; } <del> } // Skip foreign unstable traits from lists of trait implementations and // such. This helps prevent dependencies of the standard library, for // example, from getting documented as "traits `u32` implements" which // isn't really too helpful. if let Some(trait_did) = associated_trait { if let Some(stab) = cx.tcx.lookup_stability(trait_did.def_id) { if stab.level.is_unstable() { </del> <ins> if let Some(stab) = tcx.lookup_stability(did) { if stab.level.is_unstable() && stab.feature == sym::rustc_private { </ins> return; } }

if !cx.renderinfo.borrow().access_levels.is_public(did) { return; } <ins> if let Some(stab) = tcx.lookup_stability(did) { if stab.level.is_unstable() && stab.feature == sym::rustc_private { return; } } </ins> } }

<ins> // aux-build:realcore.rs #![crate_name = "real_gimli"] #![feature(staged_api, extremely_unstable)] #![unstable(feature = "rustc_private", issue = "none")] extern crate realcore; #[unstable(feature = "rustc_private", issue = "none")] pub struct EndianSlice; #[unstable(feature = "rustc_private", issue = "none")] impl realcore::Deref for EndianSlice {} </ins>

<ins> #![crate_name = "realcore"] #![feature(staged_api)] #![unstable(feature = "extremely_unstable", issue = "none")] #[unstable(feature = "extremely_unstable_foo", issue = "none")] pub struct Foo {} #[unstable(feature = "extremely_unstable_foo", issue = "none")] pub trait Join {} #[unstable(feature = "extremely_unstable_foo", issue = "none")] impl Join for Foo {} #[stable(feature = "faked_deref", since = "1.47.0")] pub trait Deref {} </ins>

<ins> // ignore-tidy-linelength // aux-build:realcore.rs // aux-build:real_gimli.rs // Ensure unstably exported traits have their Implementors sections. #![crate_name = "foo"] #![feature(extremely_unstable_foo)] extern crate realcore; extern crate real_gimli; // issue #74672 // @!has foo/trait.Deref.html '//*[@id="impl-Deref-for-EndianSlice"]//code' 'impl Deref for EndianSlice' pub use realcore::Deref; // @has foo/trait.Join.html '//*[@id="impl-Join-for-Foo"]//code' 'impl Join for Foo' pub use realcore::Join; </ins>

if let Some(entry) = LINKCHECK_EXCEPTIONS.iter().find(|&(f, _)| file.ends_with(f)) { entry.1.contains(&link) } else { <ins> // FIXME(#63351): Concat trait in alloc/slice reexported in primitive page // // NOTE: This cannot be added to `LINKCHECK_EXCEPTIONS` because the resolved path // calculated in `check` function is outside `build/<triple>/doc` dir. // So the `strip_prefix` method just returns the old absolute broken path. if file.ends_with("std/primitive.slice.html") { if link.ends_with("primitive.slice.html") { return true; } } </ins> false } }