| // With -Zub-checks=yes (enabled by default by -Cdebug-assertions=yes) we will produce a runtime | |
| // check that the index to slice::get_unchecked is in-bounds of the slice. That is tested for by | |
| // tests/ui/precondition-checks/out-of-bounds-get-unchecked.rs | |
| // | |
| // This test ensures that such a runtime check is *not* emitted when debug-assertions are enabled, | |
| // but ub-checks are explicitly disabled. | |
| //@ revisions: DEBUG NOCHECKS | |
| // [DEBUG] no extra compile-flags | |
| //@ [NOCHECKS] compile-flags: -Zub-checks=no | |
| //@ compile-flags: -Copt-level=3 -Cdebug-assertions=yes | |
| #![crate_type = "lib"] | |
| use std::ops::Range; | |
| // CHECK-LABEL: @slice_get_unchecked( | |
| #[no_mangle] | |
| pub unsafe fn slice_get_unchecked(x: &[i32], i: usize) -> &i32 { | |
| // CHECK: icmp ult | |
| // NOCHECKS: tail call void @llvm.assume | |
| // DEBUG: br i1 | |
| // DEBUG: call core::panicking::panic_nounwind | |
| // DEBUG: unreachable | |
| // CHECK: getelementptr inbounds | |
| // CHECK: ret ptr | |
| x.get_unchecked(i) | |
| } |