From fdeb38b903d3842a0600dc2e80f19a58469a69cb Mon Sep 17 00:00:00 2001
From: Eric Huss <eric@huss.org>
Date: Mon, 24 Jan 2022 17:10:05 -0800
Subject: [PATCH] Fix documenting with undocumented dependencies.

---
 src/cargo/core/compiler/unit_dependencies.rs | 28 ++++++------
 tests/testsuite/doc.rs                       | 47 +++++++++++++++++++-
 2 files changed, 61 insertions(+), 14 deletions(-)

diff --git a/src/cargo/core/compiler/unit_dependencies.rs b/src/cargo/core/compiler/unit_dependencies.rs
index a3bcecc1782..c2575fd77f1 100644
--- a/src/cargo/core/compiler/unit_dependencies.rs
+++ b/src/cargo/core/compiler/unit_dependencies.rs
@@ -431,7 +431,7 @@ fn compute_deps_doc(
     let mut ret = Vec::new();
     for (id, _deps) in deps {
         let dep = state.get(id);
-        let lib = match dep.targets().iter().find(|t| t.is_lib() && t.documented()) {
+        let lib = match dep.targets().iter().find(|t| t.is_lib()) {
             Some(lib) => lib,
             None => continue,
         };
@@ -449,18 +449,20 @@ fn compute_deps_doc(
             mode,
         )?;
         ret.push(lib_unit_dep);
-        if let CompileMode::Doc { deps: true } = unit.mode {
-            // Document this lib as well.
-            let doc_unit_dep = new_unit_dep(
-                state,
-                unit,
-                dep,
-                lib,
-                dep_unit_for,
-                unit.kind.for_target(lib),
-                unit.mode,
-            )?;
-            ret.push(doc_unit_dep);
+        if lib.documented() {
+            if let CompileMode::Doc { deps: true } = unit.mode {
+                // Document this lib as well.
+                let doc_unit_dep = new_unit_dep(
+                    state,
+                    unit,
+                    dep,
+                    lib,
+                    dep_unit_for,
+                    unit.kind.for_target(lib),
+                    unit.mode,
+                )?;
+                ret.push(doc_unit_dep);
+            }
         }
     }
 
diff --git a/tests/testsuite/doc.rs b/tests/testsuite/doc.rs
index 869e4f3342f..da500d4a1d4 100644
--- a/tests/testsuite/doc.rs
+++ b/tests/testsuite/doc.rs
@@ -2557,7 +2557,7 @@ fn doc_lib_false() {
                 bar = {path = "bar"}
             "#,
         )
-        .file("src/lib.rs", "")
+        .file("src/lib.rs", "extern crate bar;")
         .file("src/bin/some-bin.rs", "fn main() {}")
         .file(
             "bar/Cargo.toml",
@@ -2588,3 +2588,48 @@ fn doc_lib_false() {
     assert!(!p.build_dir().join("doc/bar").exists());
     assert!(p.build_dir().join("doc/some_bin").exists());
 }
+
+#[cargo_test]
+fn doc_lib_false_dep() {
+    // doc = false for a dependency
+    // Ensures that the rmeta gets produced
+    let p = project()
+        .file(
+            "Cargo.toml",
+            r#"
+                [package]
+                name = "foo"
+                version = "0.1.0"
+
+                [dependencies]
+                bar = { path = "bar" }
+            "#,
+        )
+        .file("src/lib.rs", "extern crate bar;")
+        .file(
+            "bar/Cargo.toml",
+            r#"
+                [package]
+                name = "bar"
+                version = "0.1.0"
+
+                [lib]
+                doc = false
+            "#,
+        )
+        .file("bar/src/lib.rs", "")
+        .build();
+
+    p.cargo("doc")
+        .with_stderr(
+            "\
+[CHECKING] bar v0.1.0 [..]
+[DOCUMENTING] foo v0.1.0 [..]
+[FINISHED] [..]
+",
+        )
+        .run();
+
+    assert!(p.build_dir().join("doc/foo").exists());
+    assert!(!p.build_dir().join("doc/bar").exists());
+}