diff --git a/src/cargo/core/resolver/dep_cache.rs b/src/cargo/core/resolver/dep_cache.rs index 4bbb9311b1c..cf7b9fcfa51 100644 --- a/src/cargo/core/resolver/dep_cache.rs +++ b/src/cargo/core/resolver/dep_cache.rs @@ -105,14 +105,6 @@ impl<'a> RegistryQueryer<'a> { dep.version_req() ); - if dep.features().len() != 0 || !dep.uses_default_features() { - anyhow::bail!( - "patch for `{}` uses the features mechanism. \ - default-features and features will not take effect because the patch dependency does not support this mechanism", - dep.package_name() - ); - } - let mut summaries = self.registry.query_vec(dep, false)?.into_iter(); let s = summaries.next().ok_or_else(|| { anyhow::format_err!( diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs index 6a08a08d3f6..f52241f9be2 100644 --- a/src/cargo/ops/resolve.rs +++ b/src/cargo/ops/resolve.rs @@ -113,6 +113,16 @@ pub fn resolve_ws_with_opts<'cfg>( .shell() .warn(format!("package replacement is not used: {}", replace_spec))? } + + if dep.features().len() != 0 || !dep.uses_default_features() { + ws.config() + .shell() + .warn(format!( + "replacement for `{}` uses the features mechanism. \ + default-features and features will not take effect because the replacement dependency does not support this mechanism", + dep.package_name() + ))? + } } Some(resolve) diff --git a/tests/testsuite/replace.rs b/tests/testsuite/replace.rs index 010c88384df..bf12a2e57ab 100644 --- a/tests/testsuite/replace.rs +++ b/tests/testsuite/replace.rs @@ -87,15 +87,64 @@ fn override_with_features() { .build(); p.cargo("build") - .with_status(101) .with_stderr( "\ [UPDATING] [..] index -[ERROR] failed to get `bar` as a dependency of package `foo v0.0.1 ([..])` +[UPDATING] git repository `[..]` +[WARNING] replacement for `bar` uses the features mechanism. default-features and features \ +will not take effect because the replacement dependency does not support this mechanism +[COMPILING] bar v0.1.0 (file://[..]) +[COMPILING] foo v0.0.1 ([CWD]) +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] +", + ) + .run(); +} -Caused by: - patch for `bar` uses the features mechanism. default-features and features \ -will not take effect because the patch dependency does not support this mechanism +#[cargo_test] +fn override_with_setting_default_features() { + Package::new("bar", "0.1.0").publish(); + + let bar = git::repo(&paths::root().join("override")) + .file("Cargo.toml", &basic_manifest("bar", "0.1.0")) + .file("src/lib.rs", "pub fn bar() {}") + .build(); + + let p = project() + .file( + "Cargo.toml", + &format!( + r#" + [package] + name = "foo" + version = "0.0.1" + authors = [] + + [dependencies] + bar = "0.1.0" + + [replace] + "bar:0.1.0" = {{ git = '{}', default-features = false, features = ["none_default_feature"] }} + "#, + bar.url() + ), + ) + .file( + "src/lib.rs", + "extern crate bar; pub fn foo() { bar::bar(); }", + ) + .build(); + + p.cargo("build") + .with_stderr( + "\ +[UPDATING] [..] index +[UPDATING] git repository `[..]` +[WARNING] replacement for `bar` uses the features mechanism. default-features and features \ +will not take effect because the replacement dependency does not support this mechanism +[COMPILING] bar v0.1.0 (file://[..]) +[COMPILING] foo v0.0.1 ([CWD]) +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] ", ) .run();