diff options
| author | Michael Woerister <michaelwoerister@posteo> | 2021-03-22 18:09:33 +0100 |
|---|---|---|
| committer | Michael Woerister <michaelwoerister@posteo.de> | 2021-03-26 09:59:10 +0100 |
| commit | 09bab382910f8e32f6ee4a7aa90403ad99a26470 (patch) | |
| tree | ef0a22fc8e838924f7d415d06f933401568404d8 /compiler/rustc_metadata/src/creader.rs | |
| parent | bba40880c0750f880119b4517821ffe0a96f74d1 (diff) | |
| download | rust-09bab382910f8e32f6ee4a7aa90403ad99a26470.tar.gz rust-09bab382910f8e32f6ee4a7aa90403ad99a26470.zip | |
Fix #83045 by moving some crate loading verification code to a better place.
Diffstat (limited to 'compiler/rustc_metadata/src/creader.rs')
| -rw-r--r-- | compiler/rustc_metadata/src/creader.rs | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/compiler/rustc_metadata/src/creader.rs b/compiler/rustc_metadata/src/creader.rs index 9335384aa6c..9578f5d5863 100644 --- a/compiler/rustc_metadata/src/creader.rs +++ b/compiler/rustc_metadata/src/creader.rs @@ -350,7 +350,6 @@ impl<'a> CrateLoader<'a> { let Library { source, metadata } = lib; let crate_root = metadata.get_root(); let host_hash = host_lib.as_ref().map(|lib| lib.metadata.get_root().hash()); - self.verify_no_symbol_conflicts(&crate_root)?; let private_dep = self.sess.opts.externs.get(&name.as_str()).map_or(false, |e| e.is_private_dep); @@ -358,8 +357,6 @@ impl<'a> CrateLoader<'a> { // Claim this crate number and cache it let cnum = self.cstore.alloc_new_crate_num(); - self.verify_no_stable_crate_id_hash_conflicts(&crate_root, cnum)?; - info!( "register crate `{}` (cnum = {}. private_dep = {})", crate_root.name(), @@ -394,6 +391,14 @@ impl<'a> CrateLoader<'a> { None }; + // Perform some verification *after* resolve_crate_deps() above is + // known to have been successful. It seems that - in error cases - the + // cstore can be in a temporarily invalid state between cnum allocation + // and dependency resolution and the verification code would produce + // ICEs in that case (see #83045). + self.verify_no_symbol_conflicts(&crate_root)?; + self.verify_no_stable_crate_id_hash_conflicts(&crate_root, cnum)?; + let crate_metadata = CrateMetadata::new( self.sess, metadata, |
