diff options
| author | Corey Farwell <coreyf@rwell.org> | 2017-04-07 09:20:06 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-04-07 09:20:06 -0400 |
| commit | 996f06fe3597eeb2c671a34cf16d2b29aec961e7 (patch) | |
| tree | 76779c17044b0b566c2073bf71989a05153ca538 /src/librustc_metadata | |
| parent | 88e97f05412e71cde26b1da0c1d33a4818d27286 (diff) | |
| parent | 60381cd9c29c51615975894e898b47da65f0b124 (diff) | |
| download | rust-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.rs | 16 |
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() } } |
