Fewer early errors.
`build_session` is passed an `EarlyErrorHandler` and then constructs a `Handler`. But the `EarlyErrorHandler` is still used for some time after that. This commit changes `build_session` so it consumes the passed `EarlyErrorHandler`, and also drops it as soon as the `Handler` is built. As a result, `parse_cfg` and `parse_check_cfg` now take a `Handler` instead of an `EarlyErrorHandler`.
This commit is contained in:
@@ -24,7 +24,7 @@ use rustc_errors::registry::Registry;
|
||||
use rustc_errors::{
|
||||
error_code, fallback_fluent_bundle, DiagnosticBuilder, DiagnosticId, DiagnosticMessage,
|
||||
ErrorGuaranteed, FluentBundle, Handler, IntoDiagnostic, LazyFallbackBundle, MultiSpan, Noted,
|
||||
SubdiagnosticMessage, TerminalUrl,
|
||||
TerminalUrl,
|
||||
};
|
||||
use rustc_macros::HashStable_Generic;
|
||||
pub use rustc_span::def_id::StableCrateId;
|
||||
@@ -1349,7 +1349,7 @@ fn default_emitter(
|
||||
// JUSTIFICATION: literally session construction
|
||||
#[allow(rustc::bad_opt_access)]
|
||||
pub fn build_session(
|
||||
handler: &EarlyErrorHandler,
|
||||
early_handler: EarlyErrorHandler,
|
||||
sopts: config::Options,
|
||||
io: CompilerIO,
|
||||
bundle: Option<Lrc<rustc_errors::FluentBundle>>,
|
||||
@@ -1379,12 +1379,13 @@ pub fn build_session(
|
||||
None => filesearch::get_or_default_sysroot().expect("Failed finding sysroot"),
|
||||
};
|
||||
|
||||
let target_cfg = config::build_target_config(handler, &sopts, target_override, &sysroot);
|
||||
let target_cfg = config::build_target_config(&early_handler, &sopts, target_override, &sysroot);
|
||||
let host_triple = TargetTriple::from_triple(config::host_triple());
|
||||
let (host, target_warnings) = Target::search(&host_triple, &sysroot)
|
||||
.unwrap_or_else(|e| handler.early_error(format!("Error loading host specification: {e}")));
|
||||
let (host, target_warnings) = Target::search(&host_triple, &sysroot).unwrap_or_else(|e| {
|
||||
early_handler.early_error(format!("Error loading host specification: {e}"))
|
||||
});
|
||||
for warning in target_warnings.warning_messages() {
|
||||
handler.early_warn(warning)
|
||||
early_handler.early_warn(warning)
|
||||
}
|
||||
|
||||
let loader = file_loader.unwrap_or_else(|| Box::new(RealFileLoader));
|
||||
@@ -1413,6 +1414,10 @@ pub fn build_session(
|
||||
span_diagnostic = span_diagnostic.with_ice_file(ice_file);
|
||||
}
|
||||
|
||||
// Now that the proper handler has been constructed, drop the early handler
|
||||
// to prevent accidental use.
|
||||
drop(early_handler);
|
||||
|
||||
let self_profiler = if let SwitchWithOptPath::Enabled(ref d) = sopts.unstable_opts.self_profile
|
||||
{
|
||||
let directory =
|
||||
@@ -1427,7 +1432,7 @@ pub fn build_session(
|
||||
match profiler {
|
||||
Ok(profiler) => Some(Arc::new(profiler)),
|
||||
Err(e) => {
|
||||
handler.early_warn(format!("failed to create profiler: {e}"));
|
||||
span_diagnostic.emit_warning(errors::FailedToCreateProfiler { err: e.to_string() });
|
||||
None
|
||||
}
|
||||
}
|
||||
@@ -1471,7 +1476,13 @@ pub fn build_session(
|
||||
|
||||
// Check jobserver before getting `jobserver::client`.
|
||||
jobserver::check(|err| {
|
||||
handler.early_warn_with_note(err, "the build environment is likely misconfigured")
|
||||
#[allow(rustc::untranslatable_diagnostic)]
|
||||
#[allow(rustc::diagnostic_outside_of_impl)]
|
||||
parse_sess
|
||||
.span_diagnostic
|
||||
.struct_warn(err)
|
||||
.note("the build environment is likely misconfigured")
|
||||
.emit()
|
||||
});
|
||||
|
||||
let sess = Session {
|
||||
@@ -1781,16 +1792,6 @@ impl EarlyErrorHandler {
|
||||
pub fn early_warn(&self, msg: impl Into<DiagnosticMessage>) {
|
||||
self.handler.struct_warn(msg).emit()
|
||||
}
|
||||
|
||||
#[allow(rustc::untranslatable_diagnostic)]
|
||||
#[allow(rustc::diagnostic_outside_of_impl)]
|
||||
pub fn early_warn_with_note(
|
||||
&self,
|
||||
msg: impl Into<DiagnosticMessage>,
|
||||
note: impl Into<SubdiagnosticMessage>,
|
||||
) {
|
||||
self.handler.struct_warn(msg).note(note).emit()
|
||||
}
|
||||
}
|
||||
|
||||
fn mk_emitter(output: ErrorOutputType) -> Box<DynEmitter> {
|
||||
|
||||
Reference in New Issue
Block a user