diff --git a/src/librustc_metadata/creader.rs b/src/librustc_metadata/creader.rs
index f8446d83d2b9e..7562da6d78261 100644
--- a/src/librustc_metadata/creader.rs
+++ b/src/librustc_metadata/creader.rs
@@ -222,6 +222,7 @@ impl<'a> CrateLoader<'a> {
         let mut ret = None;
         self.cstore.iter_crate_data(|cnum, data| {
             if data.name() != name {
+                tracing::trace!("{} did not match {}", data.name(), name);
                 return;
             }
 
@@ -230,7 +231,10 @@ impl<'a> CrateLoader<'a> {
                     ret = Some(cnum);
                     return;
                 }
-                Some(..) => return,
+                Some(hash) => {
+                    debug!("actual hash {} did not match expected {}", hash, data.hash());
+                    return;
+                }
                 None => {}
             }
 
@@ -273,6 +277,11 @@ impl<'a> CrateLoader<'a> {
                 .1;
             if kind.matches(prev_kind) {
                 ret = Some(cnum);
+            } else {
+                debug!(
+                    "failed to load existing crate {}; kind {:?} did not match prev_kind {:?}",
+                    name, kind, prev_kind
+                );
             }
         });
         ret
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs
index f2319bfe64de8..5892edf7652b7 100644
--- a/src/librustc_resolve/lib.rs
+++ b/src/librustc_resolve/lib.rs
@@ -2385,8 +2385,12 @@ impl<'a> Resolver<'a> {
                             Res::Def(DefKind::Mod, _) => true,
                             _ => false,
                         };
-                        let mut candidates =
-                            self.lookup_import_candidates(ident, TypeNS, parent_scope, is_mod);
+                        // Don't look up import candidates if this is a speculative resolve
+                        let mut candidates = if record_used {
+                            self.lookup_import_candidates(ident, TypeNS, parent_scope, is_mod)
+                        } else {
+                            Vec::new()
+                        };
                         candidates.sort_by_cached_key(|c| {
                             (c.path.segments.len(), pprust::path_to_string(&c.path))
                         });
@@ -3200,7 +3204,7 @@ impl<'a> Resolver<'a> {
             &Segment::from_path(path),
             Some(ns),
             parent_scope,
-            true,
+            false,
             path.span,
             CrateLint::No,
         ) {
diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs
index 38fa8a402c483..50cb987cf0870 100644
--- a/src/librustdoc/clean/inline.rs
+++ b/src/librustdoc/clean/inline.rs
@@ -628,7 +628,9 @@ pub fn record_extern_trait(cx: &DocContext<'_>, did: DefId) {
         }
     }
 
-    cx.active_extern_traits.borrow_mut().insert(did);
+    {
+        cx.active_extern_traits.borrow_mut().insert(did);
+    }
 
     debug!("record_extern_trait: {:?}", did);
     let trait_ = build_external_trait(cx, did);
diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs
index 89b217dc7d4f2..7c89b38a92c75 100644
--- a/src/librustdoc/core.rs
+++ b/src/librustdoc/core.rs
@@ -439,6 +439,7 @@ pub fn run_core(
                 resolver.borrow_mut().access(|resolver| {
                     sess.time("load_extern_crates", || {
                         for extern_name in &extern_names {
+                            debug!("loading extern crate {}", extern_name);
                             resolver
                                 .resolve_str_path_error(
                                     DUMMY_SP,
diff --git a/src/librustdoc/fold.rs b/src/librustdoc/fold.rs
index 0a85cb1d5a69f..d4ada3278e6a1 100644
--- a/src/librustdoc/fold.rs
+++ b/src/librustdoc/fold.rs
@@ -93,15 +93,11 @@ pub trait DocFolder: Sized {
         c.module = c.module.take().and_then(|module| self.fold_item(module));
 
         {
-            let mut guard = c.external_traits.borrow_mut();
-            let external_traits = std::mem::replace(&mut *guard, Default::default());
-            *guard = external_traits
-                .into_iter()
-                .map(|(k, mut v)| {
-                    v.items = v.items.into_iter().filter_map(|i| self.fold_item(i)).collect();
-                    (k, v)
-                })
-                .collect();
+            let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) };
+            for (k, mut v) in external_traits {
+                v.items = v.items.into_iter().filter_map(|i| self.fold_item(i)).collect();
+                c.external_traits.borrow_mut().insert(k, v);
+            }
         }
         c
     }
diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs
index 412ab30a603b7..8d4eb67204f53 100644
--- a/src/librustdoc/passes/collect_intra_doc_links.rs
+++ b/src/librustdoc/passes/collect_intra_doc_links.rs
@@ -161,6 +161,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
                 return Some(res.map_id(|_| panic!("unexpected id")));
             }
             if let Some(module_id) = parent_id {
+                debug!("resolving {} as a macro in the module {:?}", path_str, module_id);
                 if let Ok((_, res)) =
                     resolver.resolve_str_path_error(DUMMY_SP, path_str, MacroNS, module_id)
                 {
@@ -972,15 +973,6 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
             self.fold_item_recur(item)
         }
     }
-
-    // FIXME: if we can resolve intra-doc links from other crates, we can use the stock
-    // `fold_crate`, but until then we should avoid scanning `krate.external_traits` since those
-    // will never resolve properly
-    fn fold_crate(&mut self, mut c: Crate) -> Crate {
-        c.module = c.module.take().and_then(|module| self.fold_item(module));
-
-        c
-    }
 }
 
 #[derive(Copy, Clone, Debug, PartialEq, Eq)]
diff --git a/src/test/rustdoc/intra-doc-crate/traits.rs b/src/test/rustdoc/intra-doc-crate/traits.rs
index 07f9fb6331333..07decb48019da 100644
--- a/src/test/rustdoc/intra-doc-crate/traits.rs
+++ b/src/test/rustdoc/intra-doc-crate/traits.rs
@@ -1,5 +1,3 @@
-// ignore-test
-// ^ this is https://github.com/rust-lang/rust/issues/73829
 // aux-build:traits.rs
 // build-aux-docs
 // ignore-tidy-line-length