blob: 1e20da93ba805087fe580dc37b0ebcc00f3f15ee [file] [log] [blame]
#![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();
}