]> git.lizzy.rs Git - rust.git/blob - src/test/codegen/slice-position-bounds-check.rs
Rollup merge of #52914 - nagisa:sparc-is-sparc’s-own-business, r=alexcrichton
[rust.git] / src / test / codegen / slice-position-bounds-check.rs
1 // Copyright 2017 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 // no-system-llvm
12 // compile-flags: -O -C panic=abort
13 #![crate_type = "lib"]
14
15 fn search<T: Ord + Eq>(arr: &mut [T], a: &T) -> Result<usize, ()> {
16     match arr.iter().position(|x| x == a) {
17         Some(p) => {
18             Ok(p)
19         },
20         None => Err(()),
21     }
22 }
23
24 // CHECK-LABEL: @position_no_bounds_check
25 #[no_mangle]
26 pub fn position_no_bounds_check(y: &mut [u32], x: &u32, z: &u32) -> bool {
27     // This contains "call assume" so we cannot just rule out all calls
28     // CHECK-NOT: panic_bounds_check
29     if let Ok(p) = search(y, x) {
30       y[p] == *z
31     } else {
32       false
33     }
34 }
35
36 // just to make sure that panicking really emits "panic_bounds_check" somewhere in the IR
37 // CHECK-LABEL: @test_check
38 #[no_mangle]
39 pub fn test_check(y: &[i32]) -> i32 {
40     // CHECK: panic_bounds_check
41     y[12]
42 }