blob: 8662a6456c8bf3b9551ccdfa89120de898955d2c [file] [log] [blame]
// With -Coverflow-checks=yes (enabled by default by -Cdebug-assertions=yes) we will produce a
// runtime check that panics after yielding the maximum value of the range bound type. That is
// tested for by tests/ui/iterators/rangefrom-overflow-overflow-checks.rs
//
// This test ensures such runtime checks are optimized out when debug-assertions are
// enabled, but overflow-checks are explicitly disabled.
//@ revisions: DEBUG NOCHECKS
//@ compile-flags: -O -Cdebug-assertions=yes
//@ [NOCHECKS] compile-flags: -Coverflow-checks=no
#![crate_type = "lib"]
#![feature(new_range_api)]
#![feature(new_range_remainder)]
use std::range::RangeFrom;
// CHECK-LABEL: @rangefrom_increments(
#[no_mangle]
pub unsafe fn rangefrom_increments(range: RangeFrom<i32>) -> RangeFrom<i32> {
// Iterator is contained entirely within this function, so the optimizer should
// be able to see that `exhausted` is never set and optimize out any branches.
// CHECK: i32 noundef {{(signext )?}}%range
// DEBUG: switch i32 %range
// DEBUG: call core::panicking::panic_const::panic_const_add_overflow
// DEBUG: unreachable
// NOCHECKS-NOT: unreachable
// NOCHECKS: [[REM:%[a-z_0-9.]+]] = add i32 %range, 2
// NOCHECKS-NEXT: ret i32 [[REM]]
let mut iter = range.into_iter();
let _ = iter.next();
let _ = iter.next();
iter.remainder()
}