about summary refs log tree commit diff
path: root/src/librustc_metadata
diff options
context:
space:
mode:
authorCorey Farwell <coreyf@rwell.org>2017-04-07 09:20:06 -0400
committerGitHub <noreply@github.com>2017-04-07 09:20:06 -0400
commit996f06fe3597eeb2c671a34cf16d2b29aec961e7 (patch)
tree76779c17044b0b566c2073bf71989a05153ca538 /src/librustc_metadata
parent88e97f05412e71cde26b1da0c1d33a4818d27286 (diff)
parent60381cd9c29c51615975894e898b47da65f0b124 (diff)
downloadrust-996f06fe3597eeb2c671a34cf16d2b29aec961e7.tar.gz
rust-996f06fe3597eeb2c671a34cf16d2b29aec961e7.zip
Rollup merge of #41061 - arielb1:parent-lock, r=eddyb
cstore: return an immutable borrow from `visible_parent_map`

This prevents an ICE when `visible_parent_map` is called multiple times, for example when an item referenced in an impl signature is imported from an  `extern crate` statement occurs within an impl.

Fixes #41053.

r? @eddyb
Diffstat (limited to 'src/librustc_metadata')
-rw-r--r--src/librustc_metadata/cstore_impl.rs16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs
index efcd2f007d6..37984e4c371 100644
--- a/src/librustc_metadata/cstore_impl.rs
+++ b/src/librustc_metadata/cstore_impl.rs
@@ -511,12 +511,19 @@ impl CrateStore for cstore::CStore {
     /// Returns a map from a sufficiently visible external item (i.e. an external item that is
     /// visible from at least one local module) to a sufficiently visible parent (considering
     /// modules that re-export the external item to be parents).
-    fn visible_parent_map<'a>(&'a self) -> ::std::cell::RefMut<'a, DefIdMap<DefId>> {
-        let mut visible_parent_map = self.visible_parent_map.borrow_mut();
-        if !visible_parent_map.is_empty() { return visible_parent_map; }
+    fn visible_parent_map<'a>(&'a self) -> ::std::cell::Ref<'a, DefIdMap<DefId>> {
+        {
+            let visible_parent_map = self.visible_parent_map.borrow();
+            if !visible_parent_map.is_empty() {
+                return visible_parent_map;
+            }
+        }
 
         use std::collections::vec_deque::VecDeque;
         use std::collections::hash_map::Entry;
+
+        let mut visible_parent_map = self.visible_parent_map.borrow_mut();
+
         for cnum in (1 .. self.next_crate_num().as_usize()).map(CrateNum::new) {
             let cdata = self.get_crate_data(cnum);
 
@@ -560,6 +567,7 @@ impl CrateStore for cstore::CStore {
             }
         }
 
-        visible_parent_map
+        drop(visible_parent_map);
+        self.visible_parent_map.borrow()
     }
 }