Skip to content

Commit ec137f2

Browse files
committed
catch unwind of every iter in parallel mode during wfcheck
1 parent 3b0d481 commit ec137f2

File tree

1 file changed

+5
-2
lines changed
  • compiler/rustc_data_structures/src

1 file changed

+5
-2
lines changed

compiler/rustc_data_structures/src/sync.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use crate::owning_ref::{Erased, OwningRef};
2121
use std::collections::HashMap;
2222
use std::hash::{BuildHasher, Hash};
2323
use std::ops::{Deref, DerefMut};
24+
use std::panic::{catch_unwind, resume_unwind, AssertUnwindSafe};
2425

2526
pub use std::sync::atomic::Ordering;
2627
pub use std::sync::atomic::Ordering::SeqCst;
@@ -41,7 +42,6 @@ cfg_if! {
4142
}
4243

4344
use std::ops::Add;
44-
use std::panic::{resume_unwind, catch_unwind, AssertUnwindSafe};
4545

4646
/// This is a single threaded variant of `AtomicU64`, `AtomicUsize`, etc.
4747
/// It has explicit ordering arguments and is only intended for use with
@@ -339,7 +339,10 @@ cfg_if! {
339339
t: T,
340340
for_each: impl Fn(T::Item) + Sync + Send,
341341
) {
342-
t.into_par_iter().for_each(for_each)
342+
let ps: Vec<_> = t.into_par_iter().map(|i| catch_unwind(AssertUnwindSafe(|| for_each(i)))).collect();
343+
ps.into_iter().for_each(|p| if let Err(panic) = p {
344+
resume_unwind(panic)
345+
});
343346
}
344347

345348
pub type MetadataRef = OwningRef<Box<dyn Erased + Send + Sync>, [u8]>;

0 commit comments

Comments
 (0)