@@ -30,7 +30,7 @@ use std::ops::Range;
30
30
use std:: path:: PathBuf ;
31
31
use std:: str:: FromStr ;
32
32
use std:: sync:: Once ;
33
- use std:: sync:: atomic:: { AtomicI32 , Ordering } ;
33
+ use std:: sync:: atomic:: { AtomicI32 , AtomicU32 , Ordering } ;
34
34
35
35
use miri:: {
36
36
BacktraceStyle , BorrowTrackerMethod , MiriConfig , MiriEntryFnType , ProvenanceMode , RetagFields ,
@@ -183,7 +183,8 @@ impl rustc_driver::Callbacks for MiriCompilerCalls {
183
183
if let Some ( many_seeds) = self . many_seeds . take ( ) {
184
184
assert ! ( config. seed. is_none( ) ) ;
185
185
let exit_code = sync:: IntoDynSyncSend ( AtomicI32 :: new ( rustc_driver:: EXIT_SUCCESS ) ) ;
186
- sync:: par_for_each_in ( many_seeds. seeds , |seed| {
186
+ let num_failed = sync:: IntoDynSyncSend ( AtomicU32 :: new ( 0 ) ) ;
187
+ sync:: par_for_each_in ( many_seeds. seeds . clone ( ) , |seed| {
187
188
let mut config = config. clone ( ) ;
188
189
config. seed = Some ( seed. into ( ) ) ;
189
190
eprintln ! ( "Trying seed: {seed}" ) ;
@@ -197,8 +198,13 @@ impl rustc_driver::Callbacks for MiriCompilerCalls {
197
198
std:: process:: exit ( return_code) ;
198
199
}
199
200
exit_code. store ( return_code, Ordering :: Relaxed ) ;
201
+ num_failed. fetch_add ( 1 , Ordering :: Relaxed ) ;
200
202
}
201
203
} ) ;
204
+ let num_failed = num_failed. 0 . into_inner ( ) ;
205
+ if num_failed > 0 {
206
+ eprintln ! ( "{num_failed}/{total} SEEDS FAILED" , total = many_seeds. seeds. count( ) ) ;
207
+ }
202
208
std:: process:: exit ( exit_code. 0 . into_inner ( ) ) ;
203
209
} else {
204
210
let return_code = miri:: eval_entry ( tcx, entry_def_id, entry_type, config)
0 commit comments