| // This test case checks that slice::{r}position functions do not |
| // prevent optimizing away bounds checks |
| |
| //@ compile-flags: -O |
| |
| #![crate_type = "rlib"] |
| |
| // CHECK-LABEL: @test |
| #[no_mangle] |
| pub fn test(y: &[u32], x: &u32, z: &u32) -> bool { |
| let result = match y.iter().position(|a| a == x) { |
| Some(p) => Ok(p), |
| None => Err(()), |
| }; |
| |
| if let Ok(p) = result { |
| // CHECK-NOT: panic |
| y[p] == *z |
| } else { |
| false |
| } |
| } |
| |
| // CHECK-LABEL: @rtest |
| #[no_mangle] |
| pub fn rtest(y: &[u32], x: &u32, z: &u32) -> bool { |
| let result = match y.iter().rposition(|a| a == x) { |
| Some(p) => Ok(p), |
| None => Err(()), |
| }; |
| |
| if let Ok(p) = result { |
| // CHECK-NOT: panic |
| y[p] == *z |
| } else { |
| false |
| } |
| } |