about summary refs log tree commit diff
path: root/compiler/rustc_interface/src
diff options
context:
space:
mode:
authorbjorn3 <bjorn3@users.noreply.github.com>2021-05-31 19:48:47 +0200
committerbjorn3 <bjorn3@users.noreply.github.com>2021-06-08 19:24:16 +0200
commitd376f032e65cc02e9a082ab1e919f3798af4b9dd (patch)
treec050ae424f24137151cd8ee987a802ca76eddc98 /compiler/rustc_interface/src
parentdb4d8e2cabe646bc5cfa89bb58804c47f8d6d3af (diff)
downloadrust-d376f032e65cc02e9a082ab1e919f3798af4b9dd.tar.gz
rust-d376f032e65cc02e9a082ab1e919f3798af4b9dd.zip
Let several methods take &Resolver instead of a BoxedResolver wrapper
Diffstat (limited to 'compiler/rustc_interface/src')
-rw-r--r--compiler/rustc_interface/src/passes.rs33
-rw-r--r--compiler/rustc_interface/src/queries.rs21
2 files changed, 29 insertions, 25 deletions
diff --git a/compiler/rustc_interface/src/passes.rs b/compiler/rustc_interface/src/passes.rs
index 7c5eac8bbae..79b318a4d34 100644
--- a/compiler/rustc_interface/src/passes.rs
+++ b/compiler/rustc_interface/src/passes.rs
@@ -7,7 +7,6 @@ use rustc_ast::{self as ast, visit};
 use rustc_codegen_ssa::back::link::emit_metadata;
 use rustc_codegen_ssa::traits::CodegenBackend;
 use rustc_data_structures::parallel;
-use rustc_data_structures::steal::Steal;
 use rustc_data_structures::sync::{par_iter, Lrc, OnceCell, ParallelIterator, WorkerLocal};
 use rustc_data_structures::temp_dir::MaybeTempDir;
 use rustc_errors::{ErrorReported, PResult};
@@ -346,7 +345,7 @@ fn pre_expansion_lint(
 
 fn configure_and_expand_inner<'a>(
     sess: &'a Session,
-    lint_store: &'a LintStore,
+    lint_store: &LintStore,
     mut krate: ast::Crate,
     crate_name: &str,
     resolver_arenas: &'a ResolverArenas<'a>,
@@ -669,7 +668,7 @@ fn escape_dep_env(symbol: Symbol) -> String {
 
 fn write_out_deps(
     sess: &Session,
-    boxed_resolver: &Steal<Rc<RefCell<BoxedResolver>>>,
+    resolver: &Resolver<'_>,
     outputs: &OutputFilenames,
     out_filenames: &[PathBuf],
 ) {
@@ -696,20 +695,18 @@ fn write_out_deps(
         }
 
         if sess.binary_dep_depinfo() {
-            boxed_resolver.borrow().borrow_mut().access(|resolver| {
-                for cnum in resolver.cstore().crates_untracked() {
-                    let source = resolver.cstore().crate_source_untracked(cnum);
-                    if let Some((path, _)) = source.dylib {
-                        files.push(escape_dep_filename(&path.display().to_string()));
-                    }
-                    if let Some((path, _)) = source.rlib {
-                        files.push(escape_dep_filename(&path.display().to_string()));
-                    }
-                    if let Some((path, _)) = source.rmeta {
-                        files.push(escape_dep_filename(&path.display().to_string()));
-                    }
+            for cnum in resolver.cstore().crates_untracked() {
+                let source = resolver.cstore().crate_source_untracked(cnum);
+                if let Some((path, _)) = source.dylib {
+                    files.push(escape_dep_filename(&path.display().to_string()));
                 }
-            });
+                if let Some((path, _)) = source.rlib {
+                    files.push(escape_dep_filename(&path.display().to_string()));
+                }
+                if let Some((path, _)) = source.rmeta {
+                    files.push(escape_dep_filename(&path.display().to_string()));
+                }
+            }
         }
 
         let mut file = BufWriter::new(fs::File::create(&deps_filename)?);
@@ -765,7 +762,7 @@ pub fn prepare_outputs(
     sess: &Session,
     compiler: &Compiler,
     krate: &ast::Crate,
-    boxed_resolver: &Steal<Rc<RefCell<BoxedResolver>>>,
+    resolver: &Resolver<'_>,
     crate_name: &str,
 ) -> Result<OutputFilenames> {
     let _timer = sess.timer("prepare_outputs");
@@ -805,7 +802,7 @@ pub fn prepare_outputs(
         }
     }
 
-    write_out_deps(sess, boxed_resolver, &outputs, &output_paths);
+    write_out_deps(sess, resolver, &outputs, &output_paths);
 
     let only_dep_info = sess.opts.output_types.contains_key(&OutputType::DepInfo)
         && sess.opts.output_types.len() == 1;
diff --git a/compiler/rustc_interface/src/queries.rs b/compiler/rustc_interface/src/queries.rs
index 2320f0b47d2..cc9c30986e9 100644
--- a/compiler/rustc_interface/src/queries.rs
+++ b/compiler/rustc_interface/src/queries.rs
@@ -246,13 +246,20 @@ impl<'tcx> Queries<'tcx> {
             let expansion_result = self.expansion()?;
             let (krate, boxed_resolver, _) = &*expansion_result.peek();
             let crate_name = self.crate_name()?.peek();
-            passes::prepare_outputs(
-                self.session(),
-                self.compiler,
-                &krate,
-                &boxed_resolver,
-                &crate_name,
-            )
+
+            // These borrow(), borrow_mut() and access() calls are separate statements to prevent a
+            // "temporary value dropped while borrowed" error.
+            let boxed_resolver = boxed_resolver.borrow();
+            let mut boxed_resolver = boxed_resolver.borrow_mut();
+            boxed_resolver.access(|resolver| {
+                passes::prepare_outputs(
+                    self.session(),
+                    self.compiler,
+                    &krate,
+                    resolver,
+                    &crate_name,
+                )
+            })
         })
     }