Avoid BorrowMutError with RUSTC_LOG=debug

$ touch empty.rs
$ env RUSTC_LOG=debug rustc +stage1 --crate-type=lib empty.rs

Fails with a `BorrowMutError` because source map files are already
borrowed while `features_query` attempts to format a log message
containing a span.

Release the borrow before the query to avoid the issue.
This commit is contained in:
Tomasz Miąsko 2020-10-29 00:00:00 +00:00
parent a53fb30e3b
commit 2661a4edb9

View file

@ -2042,6 +2042,10 @@ fn encode_metadata_impl(tcx: TyCtxt<'_>) -> EncodedMetadata {
encoder.emit_raw_bytes(&[0, 0, 0, 0]); encoder.emit_raw_bytes(&[0, 0, 0, 0]);
let source_map_files = tcx.sess.source_map().files(); let source_map_files = tcx.sess.source_map().files();
let source_file_cache = (source_map_files[0].clone(), 0);
let required_source_files = Some(GrowableBitSet::with_capacity(source_map_files.len()));
drop(source_map_files);
let hygiene_ctxt = HygieneEncodeContext::default(); let hygiene_ctxt = HygieneEncodeContext::default();
let mut ecx = EncodeContext { let mut ecx = EncodeContext {
@ -2052,13 +2056,12 @@ fn encode_metadata_impl(tcx: TyCtxt<'_>) -> EncodedMetadata {
lazy_state: LazyState::NoNode, lazy_state: LazyState::NoNode,
type_shorthands: Default::default(), type_shorthands: Default::default(),
predicate_shorthands: Default::default(), predicate_shorthands: Default::default(),
source_file_cache: (source_map_files[0].clone(), 0), source_file_cache,
interpret_allocs: Default::default(), interpret_allocs: Default::default(),
required_source_files: Some(GrowableBitSet::with_capacity(source_map_files.len())), required_source_files,
is_proc_macro: tcx.sess.crate_types().contains(&CrateType::ProcMacro), is_proc_macro: tcx.sess.crate_types().contains(&CrateType::ProcMacro),
hygiene_ctxt: &hygiene_ctxt, hygiene_ctxt: &hygiene_ctxt,
}; };
drop(source_map_files);
// Encode the rustc version string in a predictable location. // Encode the rustc version string in a predictable location.
rustc_version().encode(&mut ecx).unwrap(); rustc_version().encode(&mut ecx).unwrap();