about summary refs log tree commit diff
path: root/tests/run-make-cargo/panic-immediate-abort-codegen/lib.rs
blob: 1e20da93ba805087fe580dc37b0ebcc00f3f15ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#![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();
}