cfg = cfg.stack_size(STACK_SIZE);
}
- match cfg.spawn(move || {
- io::set_panic(box err);
- f()
- })
- .unwrap()
- .join() {
- Ok(()) => {
- // fallthrough
- }
- Err(value) => {
- // Thread panicked without emitting a fatal diagnostic
- if !value.is::<errors::FatalError>() {
- let mut emitter = errors::emitter::BasicEmitter::stderr(errors::ColorConfig::Auto);
-
- // a .span_bug or .bug call has already printed what
- // it wants to print.
- if !value.is::<errors::ExplicitBug>() {
- emitter.emit(None, "unexpected panic", None, errors::Level::Bug);
- }
-
- let xs = ["the compiler unexpectedly panicked. this is a bug.".to_string(),
- format!("we would appreciate a bug report: {}", BUG_REPORT_URL)];
- for note in &xs {
- emitter.emit(None, ¬e[..], None, errors::Level::Note)
- }
- if let None = env::var_os("RUST_BACKTRACE") {
- emitter.emit(None,
- "run with `RUST_BACKTRACE=1` for a backtrace",
- None,
- errors::Level::Note);
- }
+ let thread = cfg.spawn(move || {
+ io::set_panic(box err);
+ f()
+ });
+
+ if let Err(value) = thread.unwrap().join() {
+ // Thread panicked without emitting a fatal diagnostic
+ if !value.is::<errors::FatalError>() {
+ let mut emitter = errors::emitter::BasicEmitter::stderr(errors::ColorConfig::Auto);
+
+ // a .span_bug or .bug call has already printed what
+ // it wants to print.
+ if !value.is::<errors::ExplicitBug>() {
+ emitter.emit(None, "unexpected panic", None, errors::Level::Bug);
+ }
- println!("{}", str::from_utf8(&data.lock().unwrap()).unwrap());
+ let xs = ["the compiler unexpectedly panicked. this is a bug.".to_string(),
+ format!("we would appreciate a bug report: {}", BUG_REPORT_URL)];
+ for note in &xs {
+ emitter.emit(None, ¬e[..], None, errors::Level::Note)
+ }
+ if let None = env::var_os("RUST_BACKTRACE") {
+ emitter.emit(None,
+ "run with `RUST_BACKTRACE=1` for a backtrace",
+ None,
+ errors::Level::Note);
}
- exit_on_err();
+ println!("{}", str::from_utf8(&data.lock().unwrap()).unwrap());
}
+
+ exit_on_err();
}
}