about summary refs log tree commit diff
path: root/library/std/src
diff options
context:
space:
mode:
authorMara Bos <m-ou.se@m-ou.se>2020-10-19 22:31:11 +0200
committerMara Bos <m-ou.se@m-ou.se>2020-10-19 22:31:11 +0200
commit2780e35246f4f1b44fc1e17bc2f99cfbfedef127 (patch)
treea8059f9799f192a5efa5da5e2718fbe55871e60c /library/std/src
parentad268bd63894953ab7038f082aa744d6a832639b (diff)
downloadrust-2780e35246f4f1b44fc1e17bc2f99cfbfedef127.tar.gz
rust-2780e35246f4f1b44fc1e17bc2f99cfbfedef127.zip
Throw core::panic!("message") as &str instead of String.
This makes it consistent with std::panic!("message"), which also throws
a &str, not a String.
Diffstat (limited to 'library/std/src')
-rw-r--r--library/std/src/lib.rs1
-rw-r--r--library/std/src/panicking.rs18
2 files changed, 18 insertions, 1 deletions
diff --git a/library/std/src/lib.rs b/library/std/src/lib.rs
index 30e7a7f3c3b..3da0ebdd498 100644
--- a/library/std/src/lib.rs
+++ b/library/std/src/lib.rs
@@ -259,6 +259,7 @@
 #![feature(exhaustive_patterns)]
 #![feature(extend_one)]
 #![feature(external_doc)]
+#![feature(fmt_as_str)]
 #![feature(fn_traits)]
 #![feature(format_args_nl)]
 #![feature(gen_future)]
diff --git a/library/std/src/panicking.rs b/library/std/src/panicking.rs
index 8dceb12de87..221ae809e23 100644
--- a/library/std/src/panicking.rs
+++ b/library/std/src/panicking.rs
@@ -478,10 +478,26 @@ pub fn begin_panic_handler(info: &PanicInfo<'_>) -> ! {
         }
     }
 
+    struct StrPanicPayload(&'static str);
+
+    unsafe impl BoxMeUp for StrPanicPayload {
+        fn take_box(&mut self) -> *mut (dyn Any + Send) {
+            Box::into_raw(Box::new(self.0))
+        }
+
+        fn get(&mut self) -> &(dyn Any + Send) {
+            &self.0
+        }
+    }
+
     let loc = info.location().unwrap(); // The current implementation always returns Some
     let msg = info.message().unwrap(); // The current implementation always returns Some
     crate::sys_common::backtrace::__rust_end_short_backtrace(move || {
-        rust_panic_with_hook(&mut PanicPayload::new(msg), info.message(), loc);
+        if let Some(msg) = msg.as_str() {
+            rust_panic_with_hook(&mut StrPanicPayload(msg), info.message(), loc);
+        } else {
+            rust_panic_with_hook(&mut PanicPayload::new(msg), info.message(), loc);
+        }
     })
 }