Remove all threading through of ErrorGuaranteed from the driver
It was inconsistently done (sometimes even within a single function) and most of the rest of the compiler uses fatal errors instead, which need to be caught using catch_with_exit_code anyway. Using fatal errors instead of ErrorGuaranteed everywhere in the driver simplifies things a bit.
This commit is contained in:
parent
030545d8c3
commit
401dd840ff
19 changed files with 175 additions and 216 deletions
|
|
@ -5,12 +5,12 @@ use std::{io, mem};
|
|||
use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap};
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use rustc_data_structures::unord::UnordSet;
|
||||
use rustc_errors::TerminalUrl;
|
||||
use rustc_errors::codes::*;
|
||||
use rustc_errors::emitter::{
|
||||
DynEmitter, HumanEmitter, HumanReadableErrorType, OutputTheme, stderr_destination,
|
||||
};
|
||||
use rustc_errors::json::JsonEmitter;
|
||||
use rustc_errors::{ErrorGuaranteed, TerminalUrl};
|
||||
use rustc_feature::UnstableFeatures;
|
||||
use rustc_hir::def::Res;
|
||||
use rustc_hir::def_id::{DefId, DefIdMap, DefIdSet, LocalDefId};
|
||||
|
|
@ -326,7 +326,7 @@ pub(crate) fn run_global_ctxt(
|
|||
show_coverage: bool,
|
||||
render_options: RenderOptions,
|
||||
output_format: OutputFormat,
|
||||
) -> Result<(clean::Crate, RenderOptions, Cache), ErrorGuaranteed> {
|
||||
) -> (clean::Crate, RenderOptions, Cache) {
|
||||
// Certain queries assume that some checks were run elsewhere
|
||||
// (see https://github.com/rust-lang/rust/pull/73566#issuecomment-656954425),
|
||||
// so type-check everything other than function bodies in this crate before running lints.
|
||||
|
|
@ -340,9 +340,7 @@ pub(crate) fn run_global_ctxt(
|
|||
tcx.hir().try_par_for_each_module(|module| tcx.ensure().check_mod_type_wf(module))
|
||||
});
|
||||
|
||||
if let Some(guar) = tcx.dcx().has_errors() {
|
||||
return Err(guar);
|
||||
}
|
||||
tcx.dcx().abort_if_errors();
|
||||
|
||||
tcx.sess.time("missing_docs", || rustc_lint::check_crate(tcx));
|
||||
tcx.sess.time("check_mod_attrs", || {
|
||||
|
|
@ -446,11 +444,9 @@ pub(crate) fn run_global_ctxt(
|
|||
LinkCollector { cx: &mut ctxt, visited_links: visited, ambiguous_links: ambiguous };
|
||||
collector.resolve_ambiguities();
|
||||
|
||||
if let Some(guar) = tcx.dcx().has_errors() {
|
||||
return Err(guar);
|
||||
}
|
||||
tcx.dcx().abort_if_errors();
|
||||
|
||||
Ok((krate, ctxt.render_options, ctxt.cache))
|
||||
(krate, ctxt.render_options, ctxt.cache)
|
||||
}
|
||||
|
||||
/// Due to <https://github.com/rust-lang/rust/pull/73566>,
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ pub(crate) use markdown::test as test_markdown;
|
|||
use rustc_ast as ast;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxIndexMap, FxIndexSet};
|
||||
use rustc_errors::emitter::HumanReadableErrorType;
|
||||
use rustc_errors::{ColorConfig, DiagCtxtHandle, ErrorGuaranteed, FatalError};
|
||||
use rustc_errors::{ColorConfig, DiagCtxtHandle};
|
||||
use rustc_hir::CRATE_HIR_ID;
|
||||
use rustc_hir::def_id::LOCAL_CRATE;
|
||||
use rustc_interface::interface;
|
||||
|
|
@ -89,11 +89,7 @@ fn get_doctest_dir() -> io::Result<TempDir> {
|
|||
TempFileBuilder::new().prefix("rustdoctest").tempdir()
|
||||
}
|
||||
|
||||
pub(crate) fn run(
|
||||
dcx: DiagCtxtHandle<'_>,
|
||||
input: Input,
|
||||
options: RustdocOptions,
|
||||
) -> Result<(), ErrorGuaranteed> {
|
||||
pub(crate) fn run(dcx: DiagCtxtHandle<'_>, input: Input, options: RustdocOptions) {
|
||||
let invalid_codeblock_attributes_name = crate::lint::INVALID_CODEBLOCK_ATTRIBUTES.name;
|
||||
|
||||
// See core::create_config for what's going on here.
|
||||
|
|
@ -167,7 +163,7 @@ pub(crate) fn run(
|
|||
Err(error) => return crate::wrap_return(dcx, Err(error)),
|
||||
};
|
||||
let args_path = temp_dir.path().join("rustdoc-cfgs");
|
||||
crate::wrap_return(dcx, generate_args_file(&args_path, &options))?;
|
||||
crate::wrap_return(dcx, generate_args_file(&args_path, &options));
|
||||
|
||||
let CreateRunnableDocTests {
|
||||
standalone_tests,
|
||||
|
|
@ -179,7 +175,7 @@ pub(crate) fn run(
|
|||
..
|
||||
} = interface::run_compiler(config, |compiler| {
|
||||
compiler.enter(|queries| {
|
||||
let collector = queries.global_ctxt()?.enter(|tcx| {
|
||||
let collector = queries.global_ctxt().enter(|tcx| {
|
||||
let crate_name = tcx.crate_name(LOCAL_CRATE).to_string();
|
||||
let crate_attrs = tcx.hir().attrs(CRATE_HIR_ID);
|
||||
let opts = scrape_test_config(crate_name, crate_attrs, args_path);
|
||||
|
|
@ -196,13 +192,11 @@ pub(crate) fn run(
|
|||
|
||||
collector
|
||||
});
|
||||
if compiler.sess.dcx().has_errors().is_some() {
|
||||
FatalError.raise();
|
||||
}
|
||||
compiler.sess.dcx().abort_if_errors();
|
||||
|
||||
Ok(collector)
|
||||
collector
|
||||
})
|
||||
})?;
|
||||
});
|
||||
|
||||
run_tests(opts, &rustdoc_options, &unused_extern_reports, standalone_tests, mergeable_tests);
|
||||
|
||||
|
|
@ -246,8 +240,6 @@ pub(crate) fn run(
|
|||
eprintln!("{unused_extern_json}");
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) fn run_tests(
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ use std::process;
|
|||
use std::sync::Arc;
|
||||
use std::sync::atomic::AtomicBool;
|
||||
|
||||
use rustc_errors::{DiagCtxtHandle, ErrorGuaranteed, FatalError};
|
||||
use rustc_errors::DiagCtxtHandle;
|
||||
use rustc_interface::interface;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_session::config::{ErrorOutputType, RustcOptGroup, make_crate_type_option};
|
||||
|
|
@ -179,7 +179,8 @@ pub fn main() {
|
|||
|
||||
let exit_code = rustc_driver::catch_with_exit_code(|| {
|
||||
let at_args = rustc_driver::args::raw_args(&early_dcx)?;
|
||||
main_args(&mut early_dcx, &at_args, using_internal_features)
|
||||
main_args(&mut early_dcx, &at_args, using_internal_features);
|
||||
Ok(())
|
||||
});
|
||||
process::exit(exit_code);
|
||||
}
|
||||
|
|
@ -699,13 +700,10 @@ fn usage(argv0: &str) {
|
|||
);
|
||||
}
|
||||
|
||||
/// A result type used by several functions under `main()`.
|
||||
type MainResult = Result<(), ErrorGuaranteed>;
|
||||
|
||||
pub(crate) fn wrap_return(dcx: DiagCtxtHandle<'_>, res: Result<(), String>) -> MainResult {
|
||||
pub(crate) fn wrap_return(dcx: DiagCtxtHandle<'_>, res: Result<(), String>) {
|
||||
match res {
|
||||
Ok(()) => dcx.has_errors().map_or(Ok(()), Err),
|
||||
Err(err) => Err(dcx.err(err)),
|
||||
Ok(()) => dcx.abort_if_errors(),
|
||||
Err(err) => dcx.fatal(err),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -714,17 +712,17 @@ fn run_renderer<'tcx, T: formats::FormatRenderer<'tcx>>(
|
|||
renderopts: config::RenderOptions,
|
||||
cache: formats::cache::Cache,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
) -> MainResult {
|
||||
) {
|
||||
match formats::run_format::<T>(krate, renderopts, cache, tcx) {
|
||||
Ok(_) => tcx.dcx().has_errors().map_or(Ok(()), Err),
|
||||
Ok(_) => tcx.dcx().abort_if_errors(),
|
||||
Err(e) => {
|
||||
let mut msg =
|
||||
tcx.dcx().struct_err(format!("couldn't generate documentation: {}", e.error));
|
||||
tcx.dcx().struct_fatal(format!("couldn't generate documentation: {}", e.error));
|
||||
let file = e.file.display().to_string();
|
||||
if !file.is_empty() {
|
||||
msg.note(format!("failed to create or modify \"{file}\""));
|
||||
}
|
||||
Err(msg.emit())
|
||||
msg.emit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -759,7 +757,7 @@ fn main_args(
|
|||
early_dcx: &mut EarlyDiagCtxt,
|
||||
at_args: &[String],
|
||||
using_internal_features: Arc<AtomicBool>,
|
||||
) -> MainResult {
|
||||
) {
|
||||
// Throw away the first argument, the name of the binary.
|
||||
// In case of at_args being empty, as might be the case by
|
||||
// passing empty argument array to execve under some platforms,
|
||||
|
|
@ -770,7 +768,7 @@ fn main_args(
|
|||
// the compiler with @empty_file as argv[0] and no more arguments.
|
||||
let at_args = at_args.get(1..).unwrap_or_default();
|
||||
|
||||
let args = rustc_driver::args::arg_expand_all(early_dcx, at_args)?;
|
||||
let args = rustc_driver::args::arg_expand_all(early_dcx, at_args);
|
||||
|
||||
let mut options = getopts::Options::new();
|
||||
for option in opts() {
|
||||
|
|
@ -788,7 +786,7 @@ fn main_args(
|
|||
let (input, options, render_options) =
|
||||
match config::Options::from_matches(early_dcx, &matches, args) {
|
||||
Some(opts) => opts,
|
||||
None => return Ok(()),
|
||||
None => return,
|
||||
};
|
||||
|
||||
let dcx =
|
||||
|
|
@ -853,11 +851,11 @@ fn main_args(
|
|||
|
||||
if sess.opts.describe_lints {
|
||||
rustc_driver::describe_lints(sess);
|
||||
return Ok(());
|
||||
return;
|
||||
}
|
||||
|
||||
compiler.enter(|queries| {
|
||||
let Ok(mut gcx) = queries.global_ctxt() else { FatalError.raise() };
|
||||
let mut gcx = queries.global_ctxt();
|
||||
if sess.dcx().has_errors().is_some() {
|
||||
sess.dcx().fatal("Compilation failed, aborting rustdoc");
|
||||
}
|
||||
|
|
@ -865,7 +863,7 @@ fn main_args(
|
|||
gcx.enter(|tcx| {
|
||||
let (krate, render_opts, mut cache) = sess.time("run_global_ctxt", || {
|
||||
core::run_global_ctxt(tcx, show_coverage, render_options, output_format)
|
||||
})?;
|
||||
});
|
||||
info!("finished with rustc");
|
||||
|
||||
if let Some(options) = scrape_examples_options {
|
||||
|
|
@ -884,10 +882,10 @@ fn main_args(
|
|||
if show_coverage {
|
||||
// if we ran coverage, bail early, we don't need to also generate docs at this point
|
||||
// (also we didn't load in any of the useful passes)
|
||||
return Ok(());
|
||||
return;
|
||||
} else if run_check {
|
||||
// Since we're in "check" mode, no need to generate anything beyond this point.
|
||||
return Ok(());
|
||||
return;
|
||||
}
|
||||
|
||||
info!("going to format");
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ use rustc_data_structures::fx::FxIndexMap;
|
|||
use rustc_errors::DiagCtxtHandle;
|
||||
use rustc_hir::intravisit::{self, Visitor};
|
||||
use rustc_hir::{self as hir};
|
||||
use rustc_interface::interface;
|
||||
use rustc_macros::{Decodable, Encodable};
|
||||
use rustc_middle::hir::nested_filter;
|
||||
use rustc_middle::ty::{self, TyCtxt};
|
||||
|
|
@ -275,7 +274,7 @@ pub(crate) fn run(
|
|||
tcx: TyCtxt<'_>,
|
||||
options: ScrapeExamplesOptions,
|
||||
bin_crate: bool,
|
||||
) -> interface::Result<()> {
|
||||
) {
|
||||
let inner = move || -> Result<(), String> {
|
||||
// Generates source files for examples
|
||||
renderopts.no_emit_shared = true;
|
||||
|
|
@ -329,8 +328,6 @@ pub(crate) fn run(
|
|||
if let Err(e) = inner() {
|
||||
tcx.dcx().fatal(e);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// Note: the DiagCtxt must be passed in explicitly because sess isn't available while parsing
|
||||
|
|
|
|||
|
|
@ -236,7 +236,8 @@ pub fn main() {
|
|||
let mut args: Vec<String> = orig_args.clone();
|
||||
pass_sysroot_env_if_given(&mut args, sys_root_env);
|
||||
|
||||
return rustc_driver::RunCompiler::new(&args, &mut DefaultCallbacks).run();
|
||||
rustc_driver::RunCompiler::new(&args, &mut DefaultCallbacks).run();
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
if orig_args.iter().any(|a| a == "--version" || a == "-V") {
|
||||
|
|
@ -296,12 +297,13 @@ pub fn main() {
|
|||
args.extend(clippy_args);
|
||||
rustc_driver::RunCompiler::new(&args, &mut ClippyCallbacks { clippy_args_var })
|
||||
.set_using_internal_features(using_internal_features)
|
||||
.run()
|
||||
.run();
|
||||
} else {
|
||||
rustc_driver::RunCompiler::new(&args, &mut RustcCallbacks { clippy_args_var })
|
||||
.set_using_internal_features(using_internal_features)
|
||||
.run()
|
||||
.run();
|
||||
}
|
||||
return Ok(());
|
||||
}))
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -289,7 +289,8 @@ fn run_compiler(
|
|||
let exit_code = rustc_driver::catch_with_exit_code(move || {
|
||||
rustc_driver::RunCompiler::new(&args, callbacks)
|
||||
.set_using_internal_features(using_internal_features)
|
||||
.run()
|
||||
.run();
|
||||
Ok(())
|
||||
});
|
||||
std::process::exit(exit_code)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue