Skip to content

Commit e0b329a

Browse files
committed
rustc_metadata: Avoid some side effects during speculative crate resolution
Namely, `update_extern_crate`. Also, stop tracking visited crates in `update_extern_crate`, the rank check does the same thing (prevents visiting dependencies if the rank didn't change), but more precisely.
1 parent e4710ad commit e0b329a

File tree

1 file changed

+5
-28
lines changed

1 file changed

+5
-28
lines changed

src/librustc_metadata/creader.rs

+5-28
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use rustc::session::config::{Sanitizer, self};
1313
use rustc_target::spec::{PanicStrategy, TargetTriple};
1414
use rustc::session::search_paths::PathKind;
1515
use rustc::middle::cstore::{CrateSource, ExternCrate, ExternCrateSource, MetadataLoaderDyn};
16-
use rustc::util::nodemap::FxHashSet;
1716
use rustc::hir::map::Definitions;
1817
use rustc::hir::def_id::LOCAL_CRATE;
1918

@@ -483,19 +482,13 @@ impl<'a> CrateLoader<'a> {
483482
}
484483
}
485484

486-
fn update_extern_crate(&self,
487-
cnum: CrateNum,
488-
mut extern_crate: ExternCrate,
489-
visited: &mut FxHashSet<(CrateNum, bool)>)
490-
{
491-
if !visited.insert((cnum, extern_crate.is_direct())) { return }
492-
485+
fn update_extern_crate(&self, cnum: CrateNum, extern_crate: ExternCrate) {
493486
let cmeta = self.cstore.get_crate_data(cnum);
494487
if cmeta.update_extern_crate(extern_crate) {
495-
// Propagate the extern crate info to dependencies.
496-
extern_crate.dependency_of = cnum;
488+
// Propagate the extern crate info to dependencies if it was updated.
489+
let extern_crate = ExternCrate { dependency_of: cnum, ..extern_crate };
497490
for &dep_cnum in cmeta.dependencies().iter() {
498-
self.update_extern_crate(dep_cnum, extern_crate, visited);
491+
self.update_extern_crate(dep_cnum, extern_crate);
499492
}
500493
}
501494
}
@@ -935,7 +928,6 @@ impl<'a> CrateLoader<'a> {
935928
path_len,
936929
dependency_of: LOCAL_CRATE,
937930
},
938-
&mut FxHashSet::default(),
939931
);
940932
cnum
941933
}
@@ -955,27 +947,12 @@ impl<'a> CrateLoader<'a> {
955947
path_len: usize::max_value(),
956948
dependency_of: LOCAL_CRATE,
957949
},
958-
&mut FxHashSet::default(),
959950
);
960951

961952
cnum
962953
}
963954

964955
pub fn maybe_process_path_extern(&mut self, name: Symbol, span: Span) -> Option<CrateNum> {
965-
let cnum = self.maybe_resolve_crate(name, span, DepKind::Explicit, None).ok()?;
966-
967-
self.update_extern_crate(
968-
cnum,
969-
ExternCrate {
970-
src: ExternCrateSource::Path,
971-
span,
972-
// to have the least priority in `update_extern_crate`
973-
path_len: usize::max_value(),
974-
dependency_of: LOCAL_CRATE,
975-
},
976-
&mut FxHashSet::default(),
977-
);
978-
979-
Some(cnum)
956+
self.maybe_resolve_crate(name, span, DepKind::Explicit, None).ok()
980957
}
981958
}

0 commit comments

Comments
 (0)