summary refs log tree commit diff
path: root/src/librustdoc/html/render
diff options
context:
space:
mode:
authorJacob Hoffman-Andrews <github@hoffman-andrews.com>2022-10-23 02:47:20 -0700
committerJacob Hoffman-Andrews <github@hoffman-andrews.com>2022-10-23 22:14:10 -0700
commit63d1a721f187faf007e8540e4d5b6b2e494231eb (patch)
treea3d447e73c0ea5550577d8ae5ca2e98351f7f3c7 /src/librustdoc/html/render
parent415d8fcc3e17f8c1324a81cf2aa7127b4fcfa32e (diff)
downloadrust-63d1a721f187faf007e8540e4d5b6b2e494231eb.tar.gz
rust-63d1a721f187faf007e8540e4d5b6b2e494231eb.zip
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.
Diffstat (limited to 'src/librustdoc/html/render')
-rw-r--r--src/librustdoc/html/render/mod.rs9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs
index cd56d73e7d4..b2fac722827 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();