@@ -273,8 +273,7 @@ pub(crate) fn run(
273273 std:: process:: exit ( 1 ) ;
274274 }
275275
276- let mut cargo_args: Vec < OsString > = cargo_args. iter ( ) . map ( Into :: into) . collect ( ) ;
277-
276+ let cargo_args: Vec < OsString > = cargo_args. iter ( ) . map ( Into :: into) . collect ( ) ;
278277 let clang_target = clang_target ( triple, platform) ;
279278 let cargo_bin = env:: var ( "CARGO" ) . unwrap_or_else ( |_| "cargo" . into ( ) ) ;
280279 let mut cargo_cmd = Command :: new ( & cargo_bin) ;
@@ -300,6 +299,17 @@ pub(crate) fn run(
300299
301300 cargo_cmd. current_dir ( dir) . envs ( envs) ;
302301
302+ let cargo_args = if !cargo_args. is_empty ( ) && cargo_args[ 0 ] . as_os_str ( ) == "--" {
303+ & cargo_args[ 1 ..]
304+ } else {
305+ & cargo_args[ ..]
306+ } ;
307+
308+ // Handle the case where `--` is sent to the subcommand
309+ let mid = cargo_args. iter ( ) . position ( |arg| arg == "--" ) . unwrap_or ( cargo_args. len ( ) ) ;
310+ let ( cargo_args, subcommand_args) = cargo_args. split_at ( mid) ;
311+ let mut cargo_args = cargo_args. to_vec ( ) ;
312+
303313 match dir. parent ( ) {
304314 Some ( parent) => {
305315 if parent != dir {
@@ -319,14 +329,13 @@ pub(crate) fn run(
319329 cargo_args. push ( "--message-format" . into ( ) ) ;
320330 cargo_args. push ( "json-render-diagnostics" . into ( ) ) ;
321331
322- let cargo_args = if !cargo_args . is_empty ( ) && cargo_args[ 0 ] . as_os_str ( ) == "--" {
323- & cargo_args [ 1 .. ]
324- } else {
325- & cargo_args [ .. ]
326- } ;
332+ cargo_cmd . args ( & cargo_args) ;
333+
334+ if !subcommand_args . is_empty ( ) {
335+ cargo_cmd . args ( subcommand_args ) ;
336+ }
327337
328338 let mut child = cargo_cmd
329- . args ( cargo_args)
330339 . stdin ( Stdio :: inherit ( ) )
331340 . stderr ( Stdio :: inherit ( ) )
332341 . stdout ( Stdio :: piped ( ) )
0 commit comments