mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Rollup merge of #100787 - chenyukang:fix-100770-pretty-crash, r=petrochenkov
Pretty printing give proper error message without panic Fixes #100770
This commit is contained in:
commit
6438f4addc
@ -1,5 +1,6 @@
|
||||
//! The various pretty-printing routines.
|
||||
|
||||
use crate::session_diagnostics::UnprettyDumpFail;
|
||||
use rustc_ast as ast;
|
||||
use rustc_ast_pretty::pprust;
|
||||
use rustc_errors::ErrorGuaranteed;
|
||||
@ -357,12 +358,15 @@ fn get_source(input: &Input, sess: &Session) -> (String, FileName) {
|
||||
(src, src_name)
|
||||
}
|
||||
|
||||
fn write_or_print(out: &str, ofile: Option<&Path>) {
|
||||
fn write_or_print(out: &str, ofile: Option<&Path>, sess: &Session) {
|
||||
match ofile {
|
||||
None => print!("{}", out),
|
||||
Some(p) => {
|
||||
if let Err(e) = std::fs::write(p, out) {
|
||||
panic!("print-print failed to write {} due to {}", p.display(), e);
|
||||
sess.emit_fatal(UnprettyDumpFail {
|
||||
path: p.display().to_string(),
|
||||
err: e.to_string(),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -402,7 +406,7 @@ pub fn print_after_parsing(
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
write_or_print(&out, ofile);
|
||||
write_or_print(&out, ofile, sess);
|
||||
}
|
||||
|
||||
pub fn print_after_hir_lowering<'tcx>(
|
||||
@ -468,7 +472,7 @@ pub fn print_after_hir_lowering<'tcx>(
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
write_or_print(&out, ofile);
|
||||
write_or_print(&out, ofile, tcx.sess);
|
||||
}
|
||||
|
||||
// In an ideal world, this would be a public function called by the driver after
|
||||
@ -512,7 +516,7 @@ fn print_with_analysis(
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
write_or_print(&out, ofile);
|
||||
write_or_print(&out, ofile, tcx.sess);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -31,3 +31,10 @@ pub(crate) struct RLinkRustcVersionMismatch<'a> {
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(driver::rlink_no_a_file)]
|
||||
pub(crate) struct RlinkNotAFile;
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(driver::unpretty_dump_fail)]
|
||||
pub(crate) struct UnprettyDumpFail {
|
||||
pub path: String,
|
||||
pub err: String,
|
||||
}
|
||||
|
@ -9,3 +9,5 @@ driver_rlink_encoding_version_mismatch = .rlink file was produced with encoding
|
||||
driver_rlink_rustc_version_mismatch = .rlink file was produced by rustc version `{$rustc_version}`, but the current version is `{$current_version}`
|
||||
|
||||
driver_rlink_no_a_file = rlink must be a file
|
||||
|
||||
driver_unpretty_dump_fail = pretty-print failed to write `{$path}` due to error `{$err}`
|
||||
|
4
src/test/ui/unpretty/avoid-crash.rs
Normal file
4
src/test/ui/unpretty/avoid-crash.rs
Normal file
@ -0,0 +1,4 @@
|
||||
// normalize-stderr-test "error `.*`" -> "$$ERROR_MESSAGE"
|
||||
// compile-flags: -o/tmp/ -Zunpretty=ast-tree
|
||||
|
||||
fn main() {}
|
4
src/test/ui/unpretty/avoid-crash.stderr
Normal file
4
src/test/ui/unpretty/avoid-crash.stderr
Normal file
@ -0,0 +1,4 @@
|
||||
error: pretty-print failed to write `/tmp/` due to $ERROR_MESSAGE
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Reference in New Issue
Block a user