| //@ compile-flags: -Copt-level=3 |
| //@ edition: 2024 |
| |
| #![crate_type = "lib"] |
| |
| // Similar to how we `assume` that `slice::Iter::position` is within the length, |
| // check that `count` also does that for `TrustedLen` iterators. |
| // See https://rust-lang.zulipchat.com/#narrow/channel/122651-general/topic/Overflow-chk.20removed.20for.20array.20of.2059.2C.20but.20not.2060.2C.20elems/with/561070780 |
| |
| // CHECK-LABEL: @filter_count_untrusted |
| #[unsafe(no_mangle)] |
| pub fn filter_count_untrusted(bar: &[u8; 1234]) -> u16 { |
| // CHECK-NOT: llvm.assume |
| // CHECK: call void @{{.+}}unwrap_failed |
| // CHECK-NOT: llvm.assume |
| let mut iter = bar.iter(); |
| let iter = std::iter::from_fn(|| iter.next()); // Make it not TrustedLen |
| u16::try_from(iter.filter(|v| **v == 0).count()).unwrap() |
| } |
| |
| // CHECK-LABEL: @filter_count_trusted |
| #[unsafe(no_mangle)] |
| pub fn filter_count_trusted(bar: &[u8; 1234]) -> u16 { |
| // CHECK-NOT: unwrap_failed |
| // CHECK: %[[ASSUME:.+]] = icmp ult {{i64|i32|i16}} %{{.+}}, 1235 |
| // CHECK-NEXT: tail call void @llvm.assume(i1 %[[ASSUME]]) |
| // CHECK-NOT: unwrap_failed |
| let iter = bar.iter(); |
| u16::try_from(iter.filter(|v| **v == 0).count()).unwrap() |
| } |
| |
| // CHECK: ; core::result::unwrap_failed |
| // CHECK-NEXT: Function Attrs |
| // CHECK-NEXT: declare{{.+}}void @{{.+}}unwrap_failed |