diff --git a/src/libcore/panic.rs b/src/libcore/panic.rs index cf8ceff6cda0d..14eb68d9b95b5 100644 --- a/src/libcore/panic.rs +++ b/src/libcore/panic.rs @@ -130,8 +130,8 @@ impl<'a> fmt::Display for PanicInfo<'a> { } // NOTE: we cannot use downcast_ref::() here // since String is not available in libcore! - // A String payload and no message is what we’d get from `std::panic!` - // called with multiple arguments. + // The payload is a String when `std::panic!` is called with multiple arguments, + // but in that case the message is also available. self.location.fmt(formatter) } diff --git a/src/libstd/panicking.rs b/src/libstd/panicking.rs index 3f5523548ce57..161c3fc7113a7 100644 --- a/src/libstd/panicking.rs +++ b/src/libstd/panicking.rs @@ -344,7 +344,7 @@ pub fn begin_panic_fmt(msg: &fmt::Arguments, let mut s = String::new(); let _ = s.write_fmt(*msg); - begin_panic(s, file_line_col) + rust_panic_with_hook(Box::new(s), Some(msg), file_line_col) } /// This is the entry point of panicking for panic!() and assert!(). @@ -360,7 +360,7 @@ pub fn begin_panic(msg: M, file_line_col: &(&'static str, u32, u3 // be performed in the parent of this thread instead of the thread that's // panicking. - rust_panic_with_hook(Box::new(msg), file_line_col) + rust_panic_with_hook(Box::new(msg), None, file_line_col) } /// Executes the primary logic for a panic, including checking for recursive @@ -371,7 +371,8 @@ pub fn begin_panic(msg: M, file_line_col: &(&'static str, u32, u3 /// run panic hooks, and then delegate to the actual implementation of panics. #[inline(never)] #[cold] -fn rust_panic_with_hook(msg: Box, +fn rust_panic_with_hook(payload: Box, + message: Option<&fmt::Arguments>, file_line_col: &(&'static str, u32, u32)) -> ! { let (file, line, col) = *file_line_col; @@ -390,8 +391,8 @@ fn rust_panic_with_hook(msg: Box, unsafe { let info = PanicInfo::internal_constructor( - &*msg, - None, + &*payload, + message, Location::internal_constructor(file, line, col), ); HOOK_LOCK.read(); @@ -412,7 +413,7 @@ fn rust_panic_with_hook(msg: Box, unsafe { intrinsics::abort() } } - rust_panic(msg) + rust_panic(payload) } /// Shim around rust_panic. Called by resume_unwind.