diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index b9b3d476748..a0d4f38c450 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -1182,7 +1182,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 0893e0c5bf3..15ed37e5cc9 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(); +}