@@ -25,7 +25,11 @@ impl MiriEnv {
25
25
/// Returns the location of the sysroot.
26
26
///
27
27
/// If the target is None the sysroot will be built for the host machine.
28
- fn build_miri_sysroot ( & mut self , quiet : bool , target : Option < & OsStr > ) -> Result < PathBuf > {
28
+ fn build_miri_sysroot (
29
+ & mut self ,
30
+ quiet : bool ,
31
+ target : Option < impl AsRef < OsStr > > ,
32
+ ) -> Result < PathBuf > {
29
33
if let Some ( miri_sysroot) = self . sh . var_os ( "MIRI_SYSROOT" ) {
30
34
// Sysroot already set, use that.
31
35
return Ok ( miri_sysroot. into ( ) ) ;
@@ -37,14 +41,17 @@ impl MiriEnv {
37
41
self . build ( path ! ( self . miri_dir / "Cargo.toml" ) , & [ ] , quiet) ?;
38
42
self . build ( & manifest_path, & [ ] , quiet) ?;
39
43
40
- let target_flag =
41
- if let Some ( target) = target { vec ! [ OsStr :: new( "--target" ) , target] } else { vec ! [ ] } ;
44
+ let target_flag = if let Some ( target) = & target {
45
+ vec ! [ OsStr :: new( "--target" ) , target. as_ref( ) ]
46
+ } else {
47
+ vec ! [ ]
48
+ } ;
42
49
let target_flag = & target_flag;
43
50
44
51
if !quiet {
45
52
eprint ! ( "$ cargo miri setup" ) ;
46
- if let Some ( target) = target {
47
- eprint ! ( " --target {target}" , target = target. to_string_lossy( ) ) ;
53
+ if let Some ( target) = & target {
54
+ eprint ! ( " --target {target}" , target = target. as_ref ( ) . to_string_lossy( ) ) ;
48
55
}
49
56
eprintln ! ( ) ;
50
57
}
@@ -157,8 +164,8 @@ impl Command {
157
164
Command :: Build { flags } => Self :: build ( flags) ,
158
165
Command :: Check { flags } => Self :: check ( flags) ,
159
166
Command :: Test { bless, flags, target } => Self :: test ( bless, flags, target) ,
160
- Command :: Run { dep, verbose, many_seeds, flags } =>
161
- Self :: run ( dep, verbose, many_seeds, flags) ,
167
+ Command :: Run { dep, verbose, many_seeds, target , edition , flags } =>
168
+ Self :: run ( dep, verbose, many_seeds, target , edition , flags) ,
162
169
Command :: Fmt { flags } => Self :: fmt ( flags) ,
163
170
Command :: Clippy { flags } => Self :: clippy ( flags) ,
164
171
Command :: Cargo { flags } => Self :: cargo ( flags) ,
@@ -169,7 +176,7 @@ impl Command {
169
176
}
170
177
}
171
178
172
- fn toolchain ( flags : Vec < OsString > ) -> Result < ( ) > {
179
+ fn toolchain ( flags : Vec < String > ) -> Result < ( ) > {
173
180
// Make sure rustup-toolchain-install-master is installed.
174
181
which:: which ( "rustup-toolchain-install-master" )
175
182
. context ( "Please install rustup-toolchain-install-master by running 'cargo install rustup-toolchain-install-master'" ) ?;
@@ -364,7 +371,7 @@ impl Command {
364
371
Ok ( ( ) )
365
372
}
366
373
367
- fn bench ( target : Option < OsString > , benches : Vec < OsString > ) -> Result < ( ) > {
374
+ fn bench ( target : Option < String > , benches : Vec < String > ) -> Result < ( ) > {
368
375
// The hyperfine to use
369
376
let hyperfine = env:: var ( "HYPERFINE" ) ;
370
377
let hyperfine = hyperfine. as_deref ( ) . unwrap_or ( "hyperfine -w 1 -m 5 --shell=none" ) ;
@@ -378,14 +385,14 @@ impl Command {
378
385
let sh = Shell :: new ( ) ?;
379
386
sh. change_dir ( miri_dir ( ) ?) ;
380
387
let benches_dir = "bench-cargo-miri" ;
381
- let benches = if benches. is_empty ( ) {
388
+ let benches: Vec < OsString > = if benches. is_empty ( ) {
382
389
sh. read_dir ( benches_dir) ?
383
390
. into_iter ( )
384
391
. filter ( |path| path. is_dir ( ) )
385
392
. map ( Into :: into)
386
393
. collect ( )
387
394
} else {
388
- benches. to_owned ( )
395
+ benches. into_iter ( ) . map ( Into :: into ) . collect ( )
389
396
} ;
390
397
let target_flag = if let Some ( target) = target {
391
398
let mut flag = OsString :: from ( "--target=" ) ;
@@ -409,36 +416,36 @@ impl Command {
409
416
Ok ( ( ) )
410
417
}
411
418
412
- fn install ( flags : Vec < OsString > ) -> Result < ( ) > {
419
+ fn install ( flags : Vec < String > ) -> Result < ( ) > {
413
420
let e = MiriEnv :: new ( ) ?;
414
421
e. install_to_sysroot ( e. miri_dir . clone ( ) , & flags) ?;
415
422
e. install_to_sysroot ( path ! ( e. miri_dir / "cargo-miri" ) , & flags) ?;
416
423
Ok ( ( ) )
417
424
}
418
425
419
- fn build ( flags : Vec < OsString > ) -> Result < ( ) > {
426
+ fn build ( flags : Vec < String > ) -> Result < ( ) > {
420
427
let e = MiriEnv :: new ( ) ?;
421
428
e. build ( path ! ( e. miri_dir / "Cargo.toml" ) , & flags, /* quiet */ false ) ?;
422
429
e. build ( path ! ( e. miri_dir / "cargo-miri" / "Cargo.toml" ) , & flags, /* quiet */ false ) ?;
423
430
Ok ( ( ) )
424
431
}
425
432
426
- fn check ( flags : Vec < OsString > ) -> Result < ( ) > {
433
+ fn check ( flags : Vec < String > ) -> Result < ( ) > {
427
434
let e = MiriEnv :: new ( ) ?;
428
435
e. check ( path ! ( e. miri_dir / "Cargo.toml" ) , & flags) ?;
429
436
e. check ( path ! ( e. miri_dir / "cargo-miri" / "Cargo.toml" ) , & flags) ?;
430
437
Ok ( ( ) )
431
438
}
432
439
433
- fn clippy ( flags : Vec < OsString > ) -> Result < ( ) > {
440
+ fn clippy ( flags : Vec < String > ) -> Result < ( ) > {
434
441
let e = MiriEnv :: new ( ) ?;
435
442
e. clippy ( path ! ( e. miri_dir / "Cargo.toml" ) , & flags) ?;
436
443
e. clippy ( path ! ( e. miri_dir / "cargo-miri" / "Cargo.toml" ) , & flags) ?;
437
444
e. clippy ( path ! ( e. miri_dir / "miri-script" / "Cargo.toml" ) , & flags) ?;
438
445
Ok ( ( ) )
439
446
}
440
447
441
- fn cargo ( flags : Vec < OsString > ) -> Result < ( ) > {
448
+ fn cargo ( flags : Vec < String > ) -> Result < ( ) > {
442
449
let e = MiriEnv :: new ( ) ?;
443
450
let toolchain = & e. toolchain ;
444
451
// We carefully kept the working dir intact, so this will run cargo *on the workspace in the
@@ -447,7 +454,7 @@ impl Command {
447
454
Ok ( ( ) )
448
455
}
449
456
450
- fn test ( bless : bool , mut flags : Vec < OsString > , target : Option < OsString > ) -> Result < ( ) > {
457
+ fn test ( bless : bool , mut flags : Vec < String > , target : Option < String > ) -> Result < ( ) > {
451
458
let mut e = MiriEnv :: new ( ) ?;
452
459
453
460
// Prepare a sysroot.
@@ -475,21 +482,30 @@ impl Command {
475
482
dep : bool ,
476
483
verbose : bool ,
477
484
many_seeds : Option < Range < u32 > > ,
478
- mut flags : Vec < OsString > ,
485
+ target : Option < String > ,
486
+ edition : Option < String > ,
487
+ flags : Vec < String > ,
479
488
) -> Result < ( ) > {
480
489
let mut e = MiriEnv :: new ( ) ?;
481
- let target = arg_flag_value ( & flags, "--target" ) ;
482
-
483
- // Scan for "--edition", set one ourselves if that flag is not present.
484
- let have_edition = arg_flag_value ( & flags, "--edition" ) . is_some ( ) ;
485
- if !have_edition {
486
- flags. push ( "--edition=2021" . into ( ) ) ; // keep in sync with `tests/ui.rs`.`
490
+ // More flags that we will pass before `flags`
491
+ // (because `flags` may contain `--`).
492
+ let mut early_flags = Vec :: < OsString > :: new ( ) ;
493
+
494
+ // Add target, edition to flags.
495
+ if let Some ( target) = & target {
496
+ early_flags. push ( "--target" . into ( ) ) ;
497
+ early_flags. push ( target. into ( ) ) ;
498
+ }
499
+ if verbose {
500
+ early_flags. push ( "--verbose" . into ( ) ) ;
487
501
}
502
+ early_flags. push ( "--edition" . into ( ) ) ;
503
+ early_flags. push ( edition. as_deref ( ) . unwrap_or ( "2021" ) . into ( ) ) ;
488
504
489
- // Prepare a sysroot, and add it to the flags.
505
+ // Prepare a sysroot, add it to the flags.
490
506
let miri_sysroot = e. build_miri_sysroot ( /* quiet */ !verbose, target. as_deref ( ) ) ?;
491
- flags . push ( "--sysroot" . into ( ) ) ;
492
- flags . push ( miri_sysroot. into ( ) ) ;
507
+ early_flags . push ( "--sysroot" . into ( ) ) ;
508
+ early_flags . push ( miri_sysroot. into ( ) ) ;
493
509
494
510
// Compute everything needed to run the actual command. Also add MIRIFLAGS.
495
511
let miri_manifest = path ! ( e. miri_dir / "Cargo.toml" ) ;
@@ -515,7 +531,7 @@ impl Command {
515
531
} ;
516
532
cmd. set_quiet ( !verbose) ;
517
533
// Add Miri flags
518
- let cmd = cmd. args ( & miri_flags) . args ( seed_flag) . args ( & flags) ;
534
+ let cmd = cmd. args ( & miri_flags) . args ( & seed_flag) . args ( & early_flags ) . args ( & flags) ;
519
535
// And run the thing.
520
536
Ok ( cmd. run ( ) ?)
521
537
} ;
@@ -534,7 +550,7 @@ impl Command {
534
550
Ok ( ( ) )
535
551
}
536
552
537
- fn fmt ( flags : Vec < OsString > ) -> Result < ( ) > {
553
+ fn fmt ( flags : Vec < String > ) -> Result < ( ) > {
538
554
use itertools:: Itertools ;
539
555
540
556
let e = MiriEnv :: new ( ) ?;
@@ -556,6 +572,6 @@ impl Command {
556
572
. filter_ok ( |item| item. file_type ( ) . is_file ( ) )
557
573
. map_ok ( |item| item. into_path ( ) ) ;
558
574
559
- e. format_files ( files, & e. toolchain [ ..] , & config_path, & flags[ .. ] )
575
+ e. format_files ( files, & e. toolchain [ ..] , & config_path, & flags)
560
576
}
561
577
}
0 commit comments