diff options
Diffstat (limited to '')
-rw-r--r-- | src/test/ui/consts/promotion.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/test/ui/consts/promotion.rs b/src/test/ui/consts/promotion.rs new file mode 100644 index 000000000..e379e3aea --- /dev/null +++ b/src/test/ui/consts/promotion.rs @@ -0,0 +1,45 @@ +// 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 + +// build-pass + +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 { + assert_static(&fail()); + } + 42 +}; + +fn main() { + assert_static(&["a", "b", "c"]); + assert_static(&["d", "e", "f"]); + assert_eq!(C, 42); + + // make sure that these do not cause trouble despite overflowing + assert_static(&(0-1)); + assert_static(&-i32::MIN); + + // div-by-non-0 is okay + assert_static(&(1/1)); + assert_static(&(1%1)); + + // in-bounds array access is okay + assert_static(&([1,2,3][0] + 1)); + assert_static(&[[1,2][1]]); + + // Top-level projections are not part of the promoted, so no error here. + if false { + #[allow(unconditional_panic)] + assert_static(&[1,2,3][4]); + } +} |