rust/tests/run-make-cargo/panic-immediate-abort-codegen/lib.rs
2025-09-21 13:12:18 -04:00

65 lines
1.5 KiB
Rust

#![no_std]
#[unsafe(no_mangle)]
pub fn panic_noarg() {
// CHECK-LABEL: @panic_noarg(
// CHECK-NEXT: start:
// CHECK-NEXT: tail call void @llvm.trap()
panic!();
}
#[unsafe(no_mangle)]
pub fn panic_str() {
// CHECK-LABEL: @panic_str(
// CHECK-NEXT: start:
// CHECK-NEXT: tail call void @llvm.trap()
panic!("ouch");
}
#[unsafe(no_mangle)]
pub fn bounds_check(x: &[u8], idx: usize) -> &u8 {
// CHECK-LABEL: @bounds_check(
// CHECK-NEXT: start:
// CHECK-NEXT: icmp ult
// CHECK-NEXT: br i1
// CHECK: bb1:
// CHECK-NEXT: getelementptr inbounds nuw i8
// CHECK-NEXT: ret ptr
// CHECK: panic:
// CHECK-NEXT: tail call void @llvm.trap()
&x[idx]
}
#[unsafe(no_mangle)]
pub fn str_bounds_check(x: &str, idx: usize) -> &str {
// CHECK-LABEL: @str_bounds_check(
// CHECK-NOT: call
// CHECK: tail call void @llvm.trap()
// CHECK-NOT: call
&x[idx..]
}
#[unsafe(no_mangle)]
pub fn unsigned_integer_div(x: u16, y: u16) -> u16 {
// CHECK-LABEL: @unsigned_integer_div(
// CHECK-NEXT: start:
// CHECK-NEXT: icmp eq i16
// CHECK-NEXT: br i1
// CHECK: bb1:
// CHECK-NEXT: udiv i16
// CHECK-NEXT: ret i16
// CHECK: panic:
// CHECK-NEXT: tail call void @llvm.trap()
x / y
}
#[unsafe(no_mangle)]
pub fn refcell_already_borrowed() {
// CHECK-LABEL: @refcell_already_borrowed(
// CHECK-NOT: call
// CHECK: tail call void @llvm.trap()
// CHECK-NOT: call
let r = core::cell::RefCell::new(0u8);
let _guard = r.borrow_mut();
r.borrow_mut();
}