Skip to content

Commit 6554fae

Browse files
committed
Add regression test for #90815 and improve panicking() docs for #151458
1 parent fb292b7 commit 6554fae

File tree

3 files changed

+90
-1
lines changed

3 files changed

+90
-1
lines changed

library/std/src/thread/functions.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,11 @@ pub fn yield_now() {
168168
imp::yield_now()
169169
}
170170

171-
/// Determines whether the current thread is unwinding because of panic.
171+
/// Determines whether the current thread is unwinding or aborting because of panic.
172+
///
173+
/// This returns `true` if the current thread is currently panicking. This is
174+
/// true during unwinding (when `panic = "unwind"`) and also during the
175+
/// execution of the [panic hook] when `panic = "abort"`.
172176
///
173177
/// A common use of this feature is to poison shared resources when writing
174178
/// unsafe code, by checking `panicking` when the `drop` is called.
@@ -210,6 +214,7 @@ pub fn yield_now() {
210214
/// ```
211215
///
212216
/// [Mutex]: crate::sync::Mutex
217+
/// [panic hook]: crate::panic::set_hook
213218
#[inline]
214219
#[must_use]
215220
#[stable(feature = "rust1", since = "1.0.0")]
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
//@ add-minicore
2+
//@ compile-flags: --target armv7-unknown-linux-gnueabihf
3+
//@ needs-llvm-components: arm
4+
//@ ignore-backends: gcc
5+
6+
// Regression test for issue #90815.
7+
// Ensure that we emit a proper error message when inline assembly requests
8+
// more registers than available, instead of crashing with a SIGSEGV.
9+
10+
#![feature(no_core)]
11+
#![no_core]
12+
13+
extern crate minicore;
14+
use minicore::*;
15+
16+
#[no_mangle]
17+
pub unsafe fn exhausted_registers() {
18+
let r0: u32;
19+
let r1: u32;
20+
let r2: u32;
21+
let r3: u32;
22+
let r4: u32;
23+
let r5: u32;
24+
let r6: u32;
25+
let r7: u32;
26+
let r8: u32;
27+
let r9: u32;
28+
let r10: u32;
29+
let r11: u32;
30+
let r12: u32;
31+
let r13: u32;
32+
let r14: u32;
33+
let r15: u32;
34+
35+
asm!(
36+
//~^ ERROR inline assembly requires more registers than available
37+
"mov {0}, r0",
38+
"mov {1}, r1",
39+
"mov {2}, r2",
40+
"mov {3}, r3",
41+
"mov {4}, r4",
42+
"mov {5}, r5",
43+
"mov {6}, r6",
44+
"mov {7}, r7",
45+
"mov {8}, r8",
46+
"mov {9}, r9",
47+
"mov {10}, r10",
48+
"mov {11}, r11",
49+
"mov {12}, r12",
50+
"mov {13}, r13",
51+
"mov {14}, r14",
52+
"mov {15}, r15",
53+
out(reg) r0,
54+
out(reg) r1,
55+
out(reg) r2,
56+
out(reg) r3,
57+
out(reg) r4,
58+
out(reg) r5,
59+
out(reg) r6,
60+
out(reg) r7,
61+
out(reg) r8,
62+
out(reg) r9,
63+
out(reg) r10,
64+
out(reg) r11,
65+
out(reg) r12,
66+
out(reg) r13,
67+
out(reg) r14,
68+
out(reg) r15,
69+
);
70+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
error: inline assembly requires more registers than available
2+
--> $DIR/exhausted-registers-issue-90815.rs:35:5
3+
|
4+
LL | asm!(
5+
| _____^
6+
LL | | //~^ ERROR inline assembly requires more registers than available
7+
LL | | "mov {0}, r0",
8+
... |
9+
LL | | out(reg) r15,
10+
LL | | );
11+
| |_____^
12+
13+
error: aborting due to 1 previous error
14+

0 commit comments

Comments
 (0)