1
Fork 0

Stop treating extern crate loading failures as fatal errors

This commit is contained in:
Michael 2021-11-26 20:37:56 +00:00
parent 10b3a571d2
commit 62f4ce993e
12 changed files with 124 additions and 41 deletions

View file

@ -9,6 +9,7 @@ use rustc_ast::{self as ast, *};
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_data_structures::svh::Svh;
use rustc_data_structures::sync::Lrc;
use rustc_errors::FatalError;
use rustc_expand::base::SyntaxExtension;
use rustc_hir::def_id::{CrateNum, LocalDefId, StableCrateId, LOCAL_CRATE};
use rustc_hir::definitions::Definitions;
@ -507,18 +508,31 @@ impl<'a> CrateLoader<'a> {
}))
}
fn resolve_crate<'b>(
fn resolve_crate_or_abort<'b>(
&'b mut self,
name: Symbol,
span: Span,
dep_kind: CrateDepKind,
) -> CrateNum {
self.resolve_crate(name, span, dep_kind).unwrap_or_else(|| FatalError.raise())
}
fn resolve_crate<'b>(
&'b mut self,
name: Symbol,
span: Span,
dep_kind: CrateDepKind,
) -> Option<CrateNum> {
self.used_extern_options.insert(name);
self.maybe_resolve_crate(name, dep_kind, None).unwrap_or_else(|err| {
let missing_core =
self.maybe_resolve_crate(sym::core, CrateDepKind::Explicit, None).is_err();
err.report(&self.sess, span, missing_core)
})
self.maybe_resolve_crate(name, dep_kind, None).map_or_else(
|err| {
let missing_core =
self.maybe_resolve_crate(sym::core, CrateDepKind::Explicit, None).is_err();
err.report(&self.sess, span, missing_core);
None
},
|cnum| Some(cnum),
)
}
fn maybe_resolve_crate<'b>(
@ -751,7 +765,7 @@ impl<'a> CrateLoader<'a> {
};
info!("panic runtime not found -- loading {}", name);
let cnum = self.resolve_crate(name, DUMMY_SP, CrateDepKind::Implicit);
let cnum = self.resolve_crate_or_abort(name, DUMMY_SP, CrateDepKind::Implicit);
let data = self.cstore.get_crate_data(cnum);
// Sanity check the loaded crate to ensure it is indeed a panic runtime
@ -791,7 +805,7 @@ impl<'a> CrateLoader<'a> {
);
}
let cnum = self.resolve_crate(name, DUMMY_SP, CrateDepKind::Implicit);
let cnum = self.resolve_crate_or_abort(name, DUMMY_SP, CrateDepKind::Implicit);
let data = self.cstore.get_crate_data(cnum);
// Sanity check the loaded crate to ensure it is indeed a profiler runtime
@ -991,7 +1005,7 @@ impl<'a> CrateLoader<'a> {
item: &ast::Item,
definitions: &Definitions,
def_id: LocalDefId,
) -> CrateNum {
) -> Option<CrateNum> {
match item.kind {
ast::ItemKind::ExternCrate(orig_name) => {
debug!(
@ -1011,7 +1025,7 @@ impl<'a> CrateLoader<'a> {
CrateDepKind::Explicit
};
let cnum = self.resolve_crate(name, item.span, dep_kind);
let cnum = self.resolve_crate(name, item.span, dep_kind)?;
let path_len = definitions.def_path(def_id).data.len();
self.update_extern_crate(
@ -1023,14 +1037,14 @@ impl<'a> CrateLoader<'a> {
dependency_of: LOCAL_CRATE,
},
);
cnum
Some(cnum)
}
_ => bug!(),
}
}
pub fn process_path_extern(&mut self, name: Symbol, span: Span) -> CrateNum {
let cnum = self.resolve_crate(name, span, CrateDepKind::Explicit);
let cnum = self.resolve_crate_or_abort(name, span, CrateDepKind::Explicit);
self.update_extern_crate(
cnum,

View file

@ -220,7 +220,7 @@ use rustc_data_structures::memmap::Mmap;
use rustc_data_structures::owning_ref::OwningRef;
use rustc_data_structures::svh::Svh;
use rustc_data_structures::sync::MetadataRef;
use rustc_errors::struct_span_err;
use rustc_errors::{struct_span_err, DiagnosticBuilder, FatalError};
use rustc_session::config::{self, CrateType};
use rustc_session::cstore::{CrateSource, MetadataLoader};
use rustc_session::filesearch::{FileDoesntMatch, FileMatches, FileSearch};
@ -814,11 +814,11 @@ pub fn find_plugin_registrar(
span: Span,
name: Symbol,
) -> PathBuf {
match find_plugin_registrar_impl(sess, metadata_loader, name) {
Ok(res) => res,
find_plugin_registrar_impl(sess, metadata_loader, name).unwrap_or_else(|err| {
// `core` is always available if we got as far as loading plugins.
Err(err) => err.report(sess, span, false),
}
err.report(sess, span, false);
FatalError.raise()
})
}
fn find_plugin_registrar_impl<'a>(
@ -931,8 +931,8 @@ impl fmt::Display for MetadataError<'_> {
}
impl CrateError {
crate fn report(self, sess: &Session, span: Span, missing_core: bool) -> ! {
let mut err = match self {
fn build_diag(self, sess: &Session, span: Span, missing_core: bool) -> DiagnosticBuilder<'_> {
match self {
CrateError::NonAsciiName(crate_name) => sess.struct_span_err(
span,
&format!("cannot load a crate with a non-ascii name `{}`", crate_name),
@ -1208,10 +1208,10 @@ impl CrateError {
"plugin `{}` only found in rlib format, but must be available in dylib format",
crate_name,
),
};
}
}
err.emit();
sess.abort_if_errors();
unreachable!();
crate fn report(self, sess: &Session, span: Span, missing_core: bool) {
self.build_diag(sess, span, missing_core).emit();
}
}