#![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(); }