diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index f88c619bf779..34d7d2d85762 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -184,28 +184,30 @@ pub fn abort_on_err(result: Result, sess: &Session) -> pub fn run(run_compiler: F) -> isize where F: FnOnce() -> (CompileResult, Option) + Send + 'static { - let result = monitor(move || { - let (result, session) = run_compiler(); - if let Err(CompileIncomplete::Errored(_)) = result { - match session { - Some(sess) => { - sess.abort_if_errors(); - panic!("error reported but abort_if_errors didn't abort???"); - } - None => { - let emitter = - errors::emitter::EmitterWriter::stderr(errors::ColorConfig::Auto, - None, - true, - false); - let handler = errors::Handler::with_emitter(true, false, Box::new(emitter)); - handler.emit(&MultiSpan::new(), - "aborting due to previous error(s)", - errors::Level::Fatal); - panic::resume_unwind(Box::new(errors::FatalErrorMarker)); + let result = syntax::with_globals(|| { + monitor(move || { + let (result, session) = run_compiler(); + if let Err(CompileIncomplete::Errored(_)) = result { + match session { + Some(sess) => { + sess.abort_if_errors(); + panic!("error reported but abort_if_errors didn't abort???"); + } + None => { + let emitter = + errors::emitter::EmitterWriter::stderr(errors::ColorConfig::Auto, + None, + true, + false); + let handler = errors::Handler::with_emitter(true, false, Box::new(emitter)); + handler.emit(&MultiSpan::new(), + "aborting due to previous error(s)", + errors::Level::Fatal); + panic::resume_unwind(Box::new(errors::FatalErrorMarker)); + } } } - } + }) }); match result { diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs index 289f023cefae..1259da287631 100644 --- a/src/libsyntax/lib.rs +++ b/src/libsyntax/lib.rs @@ -100,10 +100,20 @@ impl Globals { pub fn with_globals(f: F) -> R where F: FnOnce() -> R { - let globals = Globals::new(); - GLOBALS.set(&globals, || { - syntax_pos::GLOBALS.set(&globals.syntax_pos_globals, f) - }) + if GLOBALS.is_set() { + if syntax_pos::GLOBALS.is_set() { + f() + } else { + GLOBALS.with(|globals| { + syntax_pos::GLOBALS.set(&globals.syntax_pos_globals, f) + }) + } + } else { + let globals = Globals::new(); + GLOBALS.set(&globals, || { + syntax_pos::GLOBALS.set(&globals.syntax_pos_globals, f) + }) + } } scoped_thread_local!(pub static GLOBALS: Globals);