about summary refs log tree commit diff
path: root/library/alloc/src
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2023-01-03 17:19:26 -0800
committerGitHub <noreply@github.com>2023-01-03 17:19:26 -0800
commitf6b0f4707bcda7b57279f9534a999dc4419f60d1 (patch)
tree3ad1434cd797eb890aceec044b321a93d3246ffe /library/alloc/src
parentc56d8eda4677c89c1a5e2771dbe637312a6f630f (diff)
parent5974f6f0a53614e82df9430b95bcb6e9473265fa (diff)
downloadrust-f6b0f4707bcda7b57279f9534a999dc4419f60d1.tar.gz
rust-f6b0f4707bcda7b57279f9534a999dc4419f60d1.zip
Rollup merge of #106045 - RalfJung:oom-nounwind-panic, r=Amanieu
default OOM handler: use non-unwinding panic, to match std handler

The OOM handler in std will by default abort. This adjusts the default in liballoc to do the same, using the `can_unwind` flag on the panic info to indicate a non-unwinding panic.

In practice this probably makes little difference since the liballoc default will only come into play in no-std situations where people write a custom panic handler, which most likely will not implement unwinding. But still, this seems more consistent.

Cc `@rust-lang/wg-allocators,` https://github.com/rust-lang/rust/issues/66741
Diffstat (limited to 'library/alloc/src')
-rw-r--r--library/alloc/src/alloc.rs15
-rw-r--r--library/alloc/src/lib.rs1
2 files changed, 15 insertions, 1 deletions
diff --git a/library/alloc/src/alloc.rs b/library/alloc/src/alloc.rs
index a2fdec6fbfe..fe6de1cf879 100644
--- a/library/alloc/src/alloc.rs
+++ b/library/alloc/src/alloc.rs
@@ -402,7 +402,20 @@ pub mod __alloc_error_handler {
     // `#[alloc_error_handler]`.
     #[rustc_std_internal_symbol]
     pub unsafe fn __rdl_oom(size: usize, _align: usize) -> ! {
-        panic!("memory allocation of {size} bytes failed")
+        extern "Rust" {
+            // This symbol is emitted by rustc next to __rust_alloc_error_handler.
+            // Its value depends on the -Zoom={panic,abort} compiler option.
+            static __rust_alloc_error_handler_should_panic: u8;
+        }
+
+        #[allow(unused_unsafe)]
+        if unsafe { __rust_alloc_error_handler_should_panic != 0 } {
+            panic!("memory allocation of {size} bytes failed")
+        } else {
+            core::panicking::panic_nounwind_fmt(format_args!(
+                "memory allocation of {size} bytes failed"
+            ))
+        }
     }
 }
 
diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs
index 9857f0516ba..bb1a85eb220 100644
--- a/library/alloc/src/lib.rs
+++ b/library/alloc/src/lib.rs
@@ -110,6 +110,7 @@
 #![feature(const_maybe_uninit_as_mut_ptr)]
 #![feature(const_refs_to_cell)]
 #![feature(core_intrinsics)]
+#![feature(core_panic)]
 #![feature(const_eval_select)]
 #![feature(const_pin)]
 #![feature(const_waker)]