diff --git a/src/bin/cargo/commands/clippy.rs b/src/bin/cargo/commands/clippy.rs index c591acfacbc..135fe51bfcb 100644 --- a/src/bin/cargo/commands/clippy.rs +++ b/src/bin/cargo/commands/clippy.rs @@ -6,6 +6,7 @@ use cargo::util; pub fn cli() -> App { subcommand("clippy-preview") .about("Checks a package to catch common mistakes and improve your Rust code.") + .arg(Arg::with_name("args").multiple(true)) .arg_package_spec( "Package(s) to check", "Check all packages in the workspace", @@ -69,7 +70,12 @@ pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult { .into()); } - let wrapper = util::process(util::config::clippy_driver()); + let mut wrapper = util::process(util::config::clippy_driver()); + + if let Some(clippy_args) = args.values_of("args") { + wrapper.args(&clippy_args.collect::>()); + } + compile_opts.build_config.primary_unit_rustc = Some(wrapper); compile_opts.build_config.force_rebuild = true; diff --git a/src/cargo/core/compiler/compilation.rs b/src/cargo/core/compiler/compilation.rs index c3a92f33546..47c64c49775 100644 --- a/src/cargo/core/compiler/compilation.rs +++ b/src/cargo/core/compiler/compilation.rs @@ -79,11 +79,7 @@ impl<'cfg> Compilation<'cfg> { pub fn new<'a>(bcx: &BuildContext<'a, 'cfg>) -> CargoResult> { let mut rustc = bcx.rustc.process(); - let mut primary_unit_rustc_process = - bcx.build_config.primary_unit_rustc.clone().map(|mut r| { - r.arg(&bcx.rustc.path); - r - }); + let mut primary_unit_rustc_process = bcx.build_config.primary_unit_rustc.clone(); if bcx.config.extra_verbose() { rustc.display_env_vars(); diff --git a/src/cargo/ops/fix.rs b/src/cargo/ops/fix.rs index a43c68687b7..415229eca6d 100644 --- a/src/cargo/ops/fix.rs +++ b/src/cargo/ops/fix.rs @@ -130,6 +130,9 @@ pub fn fix(ws: &Workspace<'_>, opts: &mut FixOptions<'_>) -> CargoResult<()> { server.configure(&mut wrapper); } + let rustc = opts.compile_opts.config.load_global_rustc(Some(ws))?; + wrapper.arg(&rustc.path); + // primary crates are compiled using a cargo subprocess to do extra work of applying fixes and // repeating build until there are no more changes to be applied opts.compile_opts.build_config.primary_unit_rustc = Some(wrapper); diff --git a/tests/testsuite/clippy.rs b/tests/testsuite/clippy.rs index 8348d2816ac..271f6878a02 100644 --- a/tests/testsuite/clippy.rs +++ b/tests/testsuite/clippy.rs @@ -38,3 +38,37 @@ fn clippy_force_rebuild() { .with_stderr_contains("[..]assert!(true)[..]") .run(); } + +#[cargo_test] +fn clippy_passes_args() { + if !clippy_is_available() { + return; + } + + // This is just a random clippy lint (assertions_on_constants) that + // hopefully won't change much in the future. + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.1.0" + + [dependencies] + "#, + ) + .file("src/lib.rs", "pub fn f() { assert!(true); }") + .build(); + + p.cargo("clippy-preview -Zunstable-options -v -- -Aclippy::assertions_on_constants") + .masquerade_as_nightly_cargo() + .with_stderr_does_not_contain("[..]assert!(true)[..]") + .run(); + + // Make sure it runs again. + p.cargo("clippy-preview -Zunstable-options -v") + .masquerade_as_nightly_cargo() + .with_stderr_contains("[..]assert!(true)[..]") + .run(); +}