Skip to content

Commit

Permalink
Rollup merge of rust-lang#122930 - RalfJung:panic-in-panic-fmt, r=Ama…
Browse files Browse the repository at this point in the history
…nieu

add panic location to 'panicked while processing panic'

Fixes rust-lang#97181

r? `@Amanieu`
  • Loading branch information
matthiaskrgr authored and RenjiSann committed Mar 25, 2024
2 parents 6b694ee + fc257fa commit af79796
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 3 deletions.
5 changes: 3 additions & 2 deletions library/core/src/panic/panic_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -161,11 +161,12 @@ impl fmt::Display for PanicInfo<'_> {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("panicked at ")?;
self.location.fmt(formatter)?;
formatter.write_str(":")?;
if let Some(message) = self.message {
formatter.write_str(":\n")?;
formatter.write_str("\n")?;
formatter.write_fmt(*message)?;
} else if let Some(payload) = self.payload.downcast_ref::<&'static str>() {
formatter.write_str(":\n")?;
formatter.write_str("\n")?;
formatter.write_str(payload)?;
}
// NOTE: we cannot use downcast_ref::<String>() here
Expand Down
8 changes: 7 additions & 1 deletion library/std/src/panicking.rs
Original file line number Diff line number Diff line change
Expand Up @@ -746,7 +746,13 @@ fn rust_panic_with_hook(
panic_count::MustAbort::PanicInHook => {
// Don't try to print the message in this case
// - perhaps that is causing the recursive panics.
rtprintpanic!("thread panicked while processing panic. aborting.\n");
let panicinfo = PanicInfo::internal_constructor(
None, // no message
location, // but we want to show the location!
can_unwind,
force_no_backtrace,
);
rtprintpanic!("{panicinfo}\nthread panicked while processing panic. aborting.\n");
}
panic_count::MustAbort::AlwaysAbort => {
// Unfortunately, this does not print a backtrace, because creating
Expand Down
25 changes: 25 additions & 0 deletions tests/ui/panics/panic-in-message-fmt.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Checks what happens when formatting the panic message panics.

//@ run-fail
//@ exec-env:RUST_BACKTRACE=0
//@ check-run-results
//@ error-pattern: panicked while processing panic
//@ normalize-stderr-test: "\n +[0-9]+:[^\n]+" -> ""
//@ normalize-stderr-test: "\n +at [^\n]+" -> ""
//@ normalize-stderr-test: "(core/src/panicking\.rs):[0-9]+:[0-9]+" -> "$1:$$LINE:$$COL"
//@ ignore-emscripten "RuntimeError" junk in output

use std::fmt::{Display, self};

struct MyStruct;

impl Display for MyStruct {
fn fmt(&self, _: &mut fmt::Formatter<'_>) -> fmt::Result {
todo!()
}
}

fn main() {
let instance = MyStruct;
panic!("this is wrong: {}", instance);
}
2 changes: 2 additions & 0 deletions tests/ui/panics/panic-in-message-fmt.run.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
panicked at $DIR/panic-in-message-fmt.rs:18:9:
thread panicked while processing panic. aborting.

0 comments on commit af79796

Please sign in to comment.