rust/tests/ui/consts/promotion.rs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

46 lines
1.1 KiB
Rust
Raw Normal View History

2021-01-06 19:11:23 +00:00
// revisions: noopt opt opt_with_overflow_checks
//[noopt]compile-flags: -C opt-level=0
//[opt]compile-flags: -O
//[opt_with_overflow_checks]compile-flags: -C overflow-checks=on -O
2021-01-06 19:11:23 +00:00
// build-pass
2021-01-06 19:11:23 +00:00
const fn assert_static<T>(_: &'static T) {}
#[allow(unconditional_panic)]
const fn fail() -> i32 {
1/0
}
const C: i32 = {
// Promoted that fails to evaluate in dead code -- this must work
// (for backwards compatibility reasons).
if false {
2021-01-06 19:11:23 +00:00
assert_static(&fail());
}
42
};
2018-01-26 14:19:01 +00:00
fn main() {
2021-01-06 19:11:23 +00:00
assert_static(&["a", "b", "c"]);
assert_static(&["d", "e", "f"]);
assert_eq!(C, 42);
// make sure that these do not cause trouble despite overflowing
2021-01-06 19:11:23 +00:00
assert_static(&(0-1));
assert_static(&-i32::MIN);
// div-by-non-0 is okay
2021-01-06 19:11:23 +00:00
assert_static(&(1/1));
assert_static(&(1%1));
// in-bounds array access is okay
2021-01-06 19:11:23 +00:00
assert_static(&([1,2,3][0] + 1));
assert_static(&[[1,2][1]]);
2021-01-06 19:11:23 +00:00
// Top-level projections are not part of the promoted, so no error here.
if false {
#[allow(unconditional_panic)]
2021-01-06 19:11:23 +00:00
assert_static(&[1,2,3][4]);
}
2018-01-26 14:19:01 +00:00
}