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