diff options
| author | Yuki Okushi <huyuumi.dev+love@gmail.com> | 2022-10-27 08:30:54 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-27 08:30:54 +0900 |
| commit | ec7ffdfbafefae52948176d67aa88119ee984f78 (patch) | |
| tree | 3e6911ea50f5191a470d12d31f2cc11d4a037902 /src | |
| parent | 36285c5de8915ecc00d91ae0baa79a87ed5858d5 (diff) | |
| parent | 63d1a721f187faf007e8540e4d5b6b2e494231eb (diff) | |
| download | rust-ec7ffdfbafefae52948176d67aa88119ee984f78.tar.gz rust-ec7ffdfbafefae52948176d67aa88119ee984f78.zip | |
Rollup merge of #103432 - jsha:box-is-not-notable, r=GuillaumeGomez
rustdoc: don't mark Box<T> as Iterator, Read, etc Because Box<T> has pass-through implementations, rustdoc was giving it the "Notable Traits" treatment for Iterator, Read, Write, and Future, even when the type of T was unspecified. Pin had the same problem, but just for Future. Fixes #100320
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustdoc/html/render/mod.rs | 9 | ||||
| -rw-r--r-- | src/test/rustdoc/doc-notable_trait_box_is_not_an_iterator.rs | 38 |
2 files changed, 47 insertions, 0 deletions
diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index eeec6f8fee7..96c57c8c85d 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -1276,6 +1276,15 @@ fn notable_traits_decl(decl: &clean::FnDecl, cx: &Context<'_>) -> String { if let Some((did, ty)) = decl.output.as_return().and_then(|t| Some((t.def_id(cx.cache())?, t))) { + // Box has pass-through impls for Read, Write, Iterator, and Future when the + // boxed type implements one of those. We don't want to treat every Box return + // as being notably an Iterator (etc), though, so we exempt it. Pin has the same + // issue, with a pass-through impl for Future. + if Some(did) == cx.tcx().lang_items().owned_box() + || Some(did) == cx.tcx().lang_items().pin_type() + { + return "".to_string(); + } if let Some(impls) = cx.cache().impls.get(&did) { for i in impls { let impl_ = i.inner_impl(); diff --git a/src/test/rustdoc/doc-notable_trait_box_is_not_an_iterator.rs b/src/test/rustdoc/doc-notable_trait_box_is_not_an_iterator.rs new file mode 100644 index 00000000000..3fb00c7db84 --- /dev/null +++ b/src/test/rustdoc/doc-notable_trait_box_is_not_an_iterator.rs @@ -0,0 +1,38 @@ +#![feature(doc_notable_trait)] +#![feature(lang_items)] +#![feature(no_core)] +#![no_core] +#[lang = "owned_box"] +pub struct Box<T>; + +impl<T> Box<T> { + pub fn new(x: T) -> Box<T> { + Box + } +} + +#[doc(notable_trait)] +pub trait FakeIterator {} + +impl<I: FakeIterator> FakeIterator for Box<I> {} + +#[lang = "pin"] +pub struct Pin<T>; + +impl<T> Pin<T> { + pub fn new(x: T) -> Pin<T> { + Pin + } +} + +impl<I: FakeIterator> FakeIterator for Pin<I> {} + +// @!has doc_notable_trait_box_is_not_an_iterator/fn.foo.html '//*' 'Notable' +pub fn foo<T>(x: T) -> Box<T> { + Box::new(x) +} + +// @!has doc_notable_trait_box_is_not_an_iterator/fn.bar.html '//*' 'Notable' +pub fn bar<T>(x: T) -> Pin<T> { + Pin::new(x) +} |
