From db0c5c1d72f32dfcf33435b4d6404b3610460d81 Mon Sep 17 00:00:00 2001 From: Lin Yihai Date: Fri, 8 Dec 2023 11:55:57 +0800 Subject: [PATCH 1/3] test(priv_dep): verify `-extern priv:` do not limit in `lib` target. --- tests/testsuite/pub_priv.rs | 158 ++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/tests/testsuite/pub_priv.rs b/tests/testsuite/pub_priv.rs index b2160e0fa11..e7f03729fbd 100644 --- a/tests/testsuite/pub_priv.rs +++ b/tests/testsuite/pub_priv.rs @@ -246,3 +246,161 @@ fn workspace_dep_made_public() { .masquerade_as_nightly_cargo(&["public-dependency"]) .run() } + +#[cargo_test(nightly, reason = "exported_private_dependencies lint is unstable")] +fn allow_priv_in_tests() { + Package::new("priv_dep", "0.1.0") + .file("src/lib.rs", "pub struct FromPriv;") + .publish(); + + let p = project() + .file( + "Cargo.toml", + r#" + cargo-features = ["public-dependency"] + + [package] + name = "foo" + version = "0.0.1" + + [dependencies] + priv_dep = {version = "0.1.0", public = false} + "#, + ) + .file( + "tests/mod.rs", + " + extern crate priv_dep; + pub fn use_priv(_: priv_dep::FromPriv) {} + ", + ) + .build(); + + p.cargo("check --tests --message-format=short") + .masquerade_as_nightly_cargo(&["public-dependency"]) + .with_stderr_contains( + "\ +tests/mod.rs:3:13: warning: type `FromPriv` from private dependency 'priv_dep' in public interface +", + ) + .run() +} + +#[cargo_test(nightly, reason = "exported_private_dependencies lint is unstable")] +fn allow_priv_in_benchs() { + Package::new("priv_dep", "0.1.0") + .file("src/lib.rs", "pub struct FromPriv;") + .publish(); + + let p = project() + .file( + "Cargo.toml", + r#" + cargo-features = ["public-dependency"] + + [package] + name = "foo" + version = "0.0.1" + + [dependencies] + priv_dep = {version = "0.1.0", public = false} + "#, + ) + .file( + "benches/mod.rs", + " + extern crate priv_dep; + pub fn use_priv(_: priv_dep::FromPriv) {} + ", + ) + .build(); + + p.cargo("check --benches --message-format=short") + .masquerade_as_nightly_cargo(&["public-dependency"]) + .with_stderr_contains( + "\ +benches/mod.rs:3:13: warning: type `FromPriv` from private dependency 'priv_dep' in public interface +", + ) + .run() +} + +#[cargo_test(nightly, reason = "exported_private_dependencies lint is unstable")] +fn allow_priv_in_bins() { + Package::new("priv_dep", "0.1.0") + .file("src/lib.rs", "pub struct FromPriv;") + .publish(); + + let p = project() + .file( + "Cargo.toml", + r#" + cargo-features = ["public-dependency"] + + [package] + name = "foo" + version = "0.0.1" + + [dependencies] + priv_dep = {version = "0.1.0", public = false} + "#, + ) + .file( + "src/main.rs", + " + extern crate priv_dep; + pub fn use_priv(_: priv_dep::FromPriv) {} + fn main() {} + ", + ) + .build(); + + p.cargo("check --bins --message-format=short") + .masquerade_as_nightly_cargo(&["public-dependency"]) + .with_stderr_contains( + "\ +src/main.rs:3:13: warning: type `FromPriv` from private dependency 'priv_dep' in public interface +", + ) + .run() +} + +#[cargo_test(nightly, reason = "exported_private_dependencies lint is unstable")] +fn allow_priv_in_examples() { + Package::new("priv_dep", "0.1.0") + .file("src/lib.rs", "pub struct FromPriv;") + .publish(); + + let p = project() + .file( + "Cargo.toml", + r#" + cargo-features = ["public-dependency"] + + [package] + name = "foo" + version = "0.0.1" + + [dependencies] + priv_dep = {version = "0.1.0", public = false} + "#, + ) + .file( + "examples/lib.rs", + " + extern crate priv_dep; + pub fn use_priv(_: priv_dep::FromPriv) {} + fn main() {} + ", + ) + .build(); + + p.cargo("check --examples --message-format=short") + .masquerade_as_nightly_cargo(&["public-dependency"]) + .with_stderr_contains( + "\ +examples/lib.rs:3:13: warning: type `FromPriv` from private dependency 'priv_dep' in public interface +", + ) + .run() +} From ab13b10066e475c120829c83bf4a1f96cc1f32c4 Mon Sep 17 00:00:00 2001 From: Lin Yihai Date: Fri, 8 Dec 2023 12:10:10 +0800 Subject: [PATCH 2/3] feat: limit `-extern priv:` to libraries --- src/cargo/core/compiler/mod.rs | 1 + tests/testsuite/pub_priv.rs | 36 ++++++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/cargo/core/compiler/mod.rs b/src/cargo/core/compiler/mod.rs index 14aa9814831..77e131e1efc 100644 --- a/src/cargo/core/compiler/mod.rs +++ b/src/cargo/core/compiler/mod.rs @@ -1434,6 +1434,7 @@ pub fn extern_args( .require(Feature::public_dependency()) .is_ok() && !dep.public + && unit.target.is_lib() { opts.push("priv"); *unstable_opts = true; diff --git a/tests/testsuite/pub_priv.rs b/tests/testsuite/pub_priv.rs index e7f03729fbd..70219486dd9 100644 --- a/tests/testsuite/pub_priv.rs +++ b/tests/testsuite/pub_priv.rs @@ -278,9 +278,14 @@ fn allow_priv_in_tests() { p.cargo("check --tests --message-format=short") .masquerade_as_nightly_cargo(&["public-dependency"]) - .with_stderr_contains( + .with_stderr( "\ -tests/mod.rs:3:13: warning: type `FromPriv` from private dependency 'priv_dep' in public interface +[UPDATING] `[..]` index +[DOWNLOADING] crates ... +[DOWNLOADED] priv_dep v0.1.0 ([..]) +[CHECKING] priv_dep v0.1.0 +[CHECKING] foo v0.0.1 ([CWD]) +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] ", ) .run() @@ -317,9 +322,14 @@ fn allow_priv_in_benchs() { p.cargo("check --benches --message-format=short") .masquerade_as_nightly_cargo(&["public-dependency"]) - .with_stderr_contains( + .with_stderr( "\ -benches/mod.rs:3:13: warning: type `FromPriv` from private dependency 'priv_dep' in public interface +[UPDATING] `[..]` index +[DOWNLOADING] crates ... +[DOWNLOADED] priv_dep v0.1.0 ([..]) +[CHECKING] priv_dep v0.1.0 +[CHECKING] foo v0.0.1 ([CWD]) +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] ", ) .run() @@ -357,9 +367,14 @@ fn allow_priv_in_bins() { p.cargo("check --bins --message-format=short") .masquerade_as_nightly_cargo(&["public-dependency"]) - .with_stderr_contains( + .with_stderr( "\ -src/main.rs:3:13: warning: type `FromPriv` from private dependency 'priv_dep' in public interface +[UPDATING] `[..]` index +[DOWNLOADING] crates ... +[DOWNLOADED] priv_dep v0.1.0 ([..]) +[CHECKING] priv_dep v0.1.0 +[CHECKING] foo v0.0.1 ([CWD]) +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] ", ) .run() @@ -397,9 +412,14 @@ fn allow_priv_in_examples() { p.cargo("check --examples --message-format=short") .masquerade_as_nightly_cargo(&["public-dependency"]) - .with_stderr_contains( + .with_stderr( "\ -examples/lib.rs:3:13: warning: type `FromPriv` from private dependency 'priv_dep' in public interface +[UPDATING] `[..]` index +[DOWNLOADING] crates ... +[DOWNLOADED] priv_dep v0.1.0 ([..]) +[CHECKING] priv_dep v0.1.0 +[CHECKING] foo v0.0.1 ([CWD]) +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] ", ) .run() From 58c673d04050aa79f8624ac321ea22ed0b1495fc Mon Sep 17 00:00:00 2001 From: Lin Yihai Date: Sat, 9 Dec 2023 17:14:10 +0800 Subject: [PATCH 3/3] test(pub_priv): covering `build.rs` test --- tests/testsuite/pub_priv.rs | 46 +++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/testsuite/pub_priv.rs b/tests/testsuite/pub_priv.rs index 70219486dd9..9792bfd7423 100644 --- a/tests/testsuite/pub_priv.rs +++ b/tests/testsuite/pub_priv.rs @@ -424,3 +424,49 @@ fn allow_priv_in_examples() { ) .run() } + +#[cargo_test(nightly, reason = "exported_private_dependencies lint is unstable")] +fn allow_priv_in_custom_build() { + Package::new("priv_dep", "0.1.0") + .file("src/lib.rs", "pub struct FromPriv;") + .publish(); + + let p = project() + .file( + "Cargo.toml", + r#" + cargo-features = ["public-dependency"] + + [package] + name = "foo" + version = "0.0.1" + + [build-dependencies] + priv_dep = "0.1.0" + "#, + ) + .file("src/main.rs", "fn main() {}") + .file( + "build.rs", + " + extern crate priv_dep; + pub fn use_priv(_: priv_dep::FromPriv) {} + fn main() {} + ", + ) + .build(); + + p.cargo("check --all-targets --message-format=short") + .masquerade_as_nightly_cargo(&["public-dependency"]) + .with_stderr( + "\ +[UPDATING] `[..]` index +[DOWNLOADING] crates ... +[DOWNLOADED] priv_dep v0.1.0 ([..]) +[COMPILING] priv_dep v0.1.0 +[COMPILING] foo v0.0.1 ([CWD]) +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] +", + ) + .run() +}