about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Howell <michael@notriddle.com>2022-04-29 14:01:57 -0700
committerMichael Howell <michael@notriddle.com>2022-04-29 14:21:40 -0700
commit62b9e0643b54f2ebe9d01e9537de7d4ad741ca83 (patch)
tree6c41e712b4afb14a4a33e2d8fc8db7658a8640ca
parent1c8966e5e9dc099b55206f34af81242d03bdb413 (diff)
downloadrust-62b9e0643b54f2ebe9d01e9537de7d4ad741ca83.tar.gz
rust-62b9e0643b54f2ebe9d01e9537de7d4ad741ca83.zip
rustdoc: show implementations on `#[fundamental]` wrappers
Fixes #92940
-rw-r--r--src/librustdoc/formats/cache.rs11
-rw-r--r--src/test/rustdoc/impl-box.rs16
2 files changed, 26 insertions, 1 deletions
diff --git a/src/librustdoc/formats/cache.rs b/src/librustdoc/formats/cache.rs
index b4d2772b31d..59ad83ab703 100644
--- a/src/librustdoc/formats/cache.rs
+++ b/src/librustdoc/formats/cache.rs
@@ -3,7 +3,7 @@ use std::mem;
 use rustc_data_structures::fx::{FxHashMap, FxHashSet};
 use rustc_hir::def_id::{CrateNum, DefId};
 use rustc_middle::middle::privacy::AccessLevels;
-use rustc_middle::ty::TyCtxt;
+use rustc_middle::ty::{self, TyCtxt};
 use rustc_span::{sym, Symbol};
 
 use crate::clean::{self, types::ExternalLocation, ExternalCrate, ItemId, PrimitiveType};
@@ -450,6 +450,15 @@ impl<'a, 'tcx> DocFolder for CacheBuilder<'a, 'tcx> {
                 clean::Type::Path { ref path }
                 | clean::BorrowedRef { type_: box clean::Type::Path { ref path }, .. } => {
                     dids.insert(path.def_id());
+                    if let Some(generics) = path.generics() &&
+                        let ty::Adt(adt, _) = self.tcx.type_of(path.def_id()).kind() &&
+                        adt.is_fundamental() {
+                        for ty in generics {
+                            if let Some(did) = ty.def_id(&self.cache) {
+                                dids.insert(did);
+                            }
+                        }
+                    }
                 }
                 clean::DynTrait(ref bounds, _)
                 | clean::BorrowedRef { type_: box clean::DynTrait(ref bounds, _), .. } => {
diff --git a/src/test/rustdoc/impl-box.rs b/src/test/rustdoc/impl-box.rs
new file mode 100644
index 00000000000..a371db135cf
--- /dev/null
+++ b/src/test/rustdoc/impl-box.rs
@@ -0,0 +1,16 @@
+// https://github.com/rust-lang/rust/issues/92940
+//
+// Show traits implemented on fundamental types that wrap local ones.
+
+pub struct MyType;
+
+// @has 'impl_box/struct.MyType.html'
+// @has '-' '//*[@id="impl-Iterator"]' 'impl Iterator for Box<MyType>'
+
+impl Iterator for Box<MyType> {
+    type Item = ();
+
+    fn next(&mut self) -> Option<Self::Item> {
+        todo!()
+    }
+}