From 77a13c03edb8830cee6f9e4050108fe587e20da5 Mon Sep 17 00:00:00 2001 From: bors Date: Tue, 16 Mar 2021 20:55:20 +0000 Subject: [PATCH] Auto merge of #9275 - ehuss:features-non-member, r=alexcrichton Fix --feature pkg/feat for V1 resolver for non-member. #8997 had an unintended regression where `-p foo --feature foo/feat` syntax where `foo` is an **optional non-member** fails with an error that `foo` did not match any packages. The issue is that the member/feature selection routine needed to slot this into the features for the package in the current working directory (it was incorrectly treating `foo` as a workspace member). V2 outright does not allow specifying features for non-workspace members. Fixes #9265 --- src/cargo/core/workspace.rs | 3 ++- tests/testsuite/package_features.rs | 31 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index e78814233..45276d45b 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -1076,7 +1076,8 @@ impl<'cfg> Workspace<'cfg> { for feature in requested_features.features.iter() { if let Some(index) = feature.find('/') { let name = &feature[..index]; - if specs.iter().any(|spec| spec.name() == name) { + let is_member = self.members().any(|member| member.name() == name); + if is_member && specs.iter().any(|spec| spec.name() == name) { member_specific_features .entry(name) .or_default() diff --git a/tests/testsuite/package_features.rs b/tests/testsuite/package_features.rs index 0893e0c5b..15ed37e5c 100644 --- a/tests/testsuite/package_features.rs +++ b/tests/testsuite/package_features.rs @@ -458,3 +458,34 @@ fn resolver1_member_features() { .with_stdout("m1-feature set") .run(); } + +#[cargo_test] +fn resolver1_non_member_optional_feature() { + // --features x/y for an optional dependency `x` with the v1 resolver. + Package::new("bar", "1.0.0") + .feature("feat1", &[]) + .file( + "src/lib.rs", + r#" + #[cfg(not(feature = "feat1"))] + compile_error!("feat1 should be activated"); + "#, + ) + .publish(); + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.1.0" + + [dependencies] + bar = { version="1.0", optional=true } + "#, + ) + .file("src/lib.rs", "") + .build(); + + p.cargo("check -p bar --features bar/feat1").run(); +} -- 2.39.5