Skip to content

Commit

Permalink
Auto merge of rust-lang#9275 - ehuss:features-non-member, r=alexcrichton
Browse files Browse the repository at this point in the history
Fix --feature pkg/feat for V1 resolver for non-member.

rust-lang#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 rust-lang#9265
  • Loading branch information
bors authored and ehuss committed Mar 16, 2021
1 parent b6bcaf3 commit 77a13c0
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/cargo/core/workspace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
31 changes: 31 additions & 0 deletions tests/testsuite/package_features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

0 comments on commit 77a13c0

Please sign in to comment.