1
Fork 0

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:
Matthias Krüger 2022-08-31 21:30:07 +02:00 committed by GitHub
commit 6438f4addc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 5 deletions

View file

@ -1,5 +1,6 @@
//! The various pretty-printing routines. //! The various pretty-printing routines.
use crate::session_diagnostics::UnprettyDumpFail;
use rustc_ast as ast; use rustc_ast as ast;
use rustc_ast_pretty::pprust; use rustc_ast_pretty::pprust;
use rustc_errors::ErrorGuaranteed; use rustc_errors::ErrorGuaranteed;
@ -357,12 +358,15 @@ fn get_source(input: &Input, sess: &Session) -> (String, FileName) {
(src, src_name) (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 { match ofile {
None => print!("{}", out), None => print!("{}", out),
Some(p) => { Some(p) => {
if let Err(e) = std::fs::write(p, out) { 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!(), _ => unreachable!(),
}; };
write_or_print(&out, ofile); write_or_print(&out, ofile, sess);
} }
pub fn print_after_hir_lowering<'tcx>( pub fn print_after_hir_lowering<'tcx>(
@ -468,7 +472,7 @@ pub fn print_after_hir_lowering<'tcx>(
_ => unreachable!(), _ => 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 // In an ideal world, this would be a public function called by the driver after
@ -512,7 +516,7 @@ fn print_with_analysis(
_ => unreachable!(), _ => unreachable!(),
}; };
write_or_print(&out, ofile); write_or_print(&out, ofile, tcx.sess);
Ok(()) Ok(())
} }

View file

@ -31,3 +31,10 @@ pub(crate) struct RLinkRustcVersionMismatch<'a> {
#[derive(SessionDiagnostic)] #[derive(SessionDiagnostic)]
#[diag(driver::rlink_no_a_file)] #[diag(driver::rlink_no_a_file)]
pub(crate) struct RlinkNotAFile; pub(crate) struct RlinkNotAFile;
#[derive(SessionDiagnostic)]
#[diag(driver::unpretty_dump_fail)]
pub(crate) struct UnprettyDumpFail {
pub path: String,
pub err: String,
}

View file

@ -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_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_rlink_no_a_file = rlink must be a file
driver_unpretty_dump_fail = pretty-print failed to write `{$path}` due to error `{$err}`

View file

@ -0,0 +1,4 @@
// normalize-stderr-test "error `.*`" -> "$$ERROR_MESSAGE"
// compile-flags: -o/tmp/ -Zunpretty=ast-tree
fn main() {}

View file

@ -0,0 +1,4 @@
error: pretty-print failed to write `/tmp/` due to $ERROR_MESSAGE
error: aborting due to previous error