blob: 9e23fd67bcd9c96bb6b0a797c4ac75dd3c3b0868 [file] [edit]
// `0..slice.len()` should propagate the same upper bound as
// `slice.iter().enumerate()`, allowing the checked index conversion to be
// removed inside the loop.
//@ compile-flags: -Copt-level=3
//@ only-64bit
//@ ignore-s390x OPT missing on s390x https://github.com/llvm/llvm-project/issues/208712
#![crate_type = "lib"]
use std::convert::TryFrom;
use std::hint::black_box;
// CHECK-LABEL: @score_round_enumerate
#[no_mangle]
pub fn score_round_enumerate(candidates: &[bool]) {
// The length check itself can still fail.
// CHECK: call void {{.*}}unwrap_failed
// But the checked conversion inside the loop should not add another panic path.
// CHECK-NOT: call void {{.*}}unwrap_failed
// CHECK: ret void
u32::try_from(candidates.len()).unwrap();
for (i, _) in candidates.iter().enumerate() {
u32::try_from(i).unwrap();
black_box(42);
}
}
// CHECK-LABEL: @score_round_range
#[no_mangle]
pub fn score_round_range(candidates: &[bool]) {
// The length check itself can still fail.
// CHECK: call void {{.*}}unwrap_failed
// But the checked conversion inside the loop should not add another panic path.
// CHECK-NOT: call void {{.*}}unwrap_failed
// CHECK: ret void
u32::try_from(candidates.len()).unwrap();
for i in 0..candidates.len() {
u32::try_from(i).unwrap();
black_box(42);
}
}