diff --git a/src/cargo/core/compiler/mod.rs b/src/cargo/core/compiler/mod.rs index eefd08e09be..d05c901360c 100644 --- a/src/cargo/core/compiler/mod.rs +++ b/src/cargo/core/compiler/mod.rs @@ -1270,34 +1270,27 @@ fn check_cfg_args(cx: &Context<'_, '_>, unit: &Unit) -> Vec { // // but having `cfg()` is redundant with the second argument (as well-known names // and values are implicitly enabled when one or more `--check-cfg` argument is - // passed) so we don't emit it: + // passed) so we don't emit it and just pass: // // --check-cfg=cfg(feature, values(...)) // - // expect when there are no features declared, where we can't generate the - // `cfg(feature, values())` argument since it would mean that it is somehow - // possible to have a `#[cfg(feature)]` without a feature name, which is - // impossible and not what we want, so we just generate: - // - // --check-cfg=cfg() + // This way, even if there are no declared features, the config `feature` will + // still be expected, meaning users would get "unexpected value" instead of name. + // This wasn't always the case, see rust-lang#119930 for some details. let gross_cap_estimation = unit.pkg.summary().features().len() * 7 + 25; let mut arg_feature = OsString::with_capacity(gross_cap_estimation); - arg_feature.push("cfg("); - if !unit.pkg.summary().features().is_empty() { - arg_feature.push("feature, values("); - for (i, feature) in unit.pkg.summary().features().keys().enumerate() { - if i != 0 { - arg_feature.push(", "); - } - arg_feature.push("\""); - arg_feature.push(feature); - arg_feature.push("\""); + arg_feature.push("cfg(feature, values("); + for (i, feature) in unit.pkg.summary().features().keys().enumerate() { + if i != 0 { + arg_feature.push(", "); } - arg_feature.push(")"); + arg_feature.push("\""); + arg_feature.push(feature); + arg_feature.push("\""); } - arg_feature.push(")"); + arg_feature.push("))"); vec![ OsString::from("-Zunstable-options"), diff --git a/tests/testsuite/check_cfg.rs b/tests/testsuite/check_cfg.rs index 47d4e278dbc..5f34774094e 100644 --- a/tests/testsuite/check_cfg.rs +++ b/tests/testsuite/check_cfg.rs @@ -15,16 +15,16 @@ macro_rules! x { $what, '(', $($who,)* ')', "'", "[..]") } }}; - ($tool:tt => $what:tt of $who:tt with $first_value:tt $($other_values:tt)*) => {{ + ($tool:tt => $what:tt of $who:tt with $($first_value:tt $($other_values:tt)*)?) => {{ #[cfg(windows)] { concat!("[RUNNING] [..]", $tool, "[..] --check-cfg \"", - $what, '(', $who, ", values(", "/\"", $first_value, "/\"", $(", ", "/\"", $other_values, "/\"",)* "))", '"', "[..]") + $what, '(', $who, ", values(", $("/\"", $first_value, "/\"", $(", ", "/\"", $other_values, "/\"",)*)* "))", '"', "[..]") } #[cfg(not(windows))] { concat!("[RUNNING] [..]", $tool, "[..] --check-cfg '", - $what, '(', $who, ", values(", "\"", $first_value, "\"", $(", ", "\"", $other_values, "\"",)* "))", "'", "[..]") + $what, '(', $who, ", values(", $("\"", $first_value, "\"", $(", ", "\"", $other_values, "\"",)*)* "))", "'", "[..]") } }}; } @@ -221,7 +221,7 @@ fn well_known_names_values() { p.cargo("check -v -Zcheck-cfg") .masquerade_as_nightly_cargo(&["check-cfg"]) - .with_stderr_contains(x!("rustc" => "cfg")) + .with_stderr_contains(x!("rustc" => "cfg" of "feature" with)) .run(); } @@ -284,7 +284,7 @@ fn well_known_names_values_test() { p.cargo("test -v -Zcheck-cfg") .masquerade_as_nightly_cargo(&["check-cfg"]) - .with_stderr_contains(x!("rustc" => "cfg")) + .with_stderr_contains(x!("rustc" => "cfg" of "feature" with)) .run(); } @@ -297,8 +297,8 @@ fn well_known_names_values_doctest() { p.cargo("test -v --doc -Zcheck-cfg") .masquerade_as_nightly_cargo(&["check-cfg"]) - .with_stderr_contains(x!("rustc" => "cfg")) - .with_stderr_contains(x!("rustdoc" => "cfg")) + .with_stderr_contains(x!("rustc" => "cfg" of "feature" with)) + .with_stderr_contains(x!("rustdoc" => "cfg" of "feature" with)) .run(); }