| // 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 |
| // ignore-pass (test emits codegen-time warnings and verifies that they are not errors) |
| |
| //! This test ensures that when we promote code that fails to evaluate, the build still succeeds. |
| |
| #![warn(arithmetic_overflow, unconditional_panic)] |
| |
| // The only way to have promoteds that fail is in `const fn` called from `const`/`static`. |
| const fn overflow() -> u32 { |
| 0 - 1 |
| //~^ WARN this arithmetic operation will overflow |
| } |
| const fn div_by_zero1() -> i32 { |
| 1 / 0 |
| //~^ WARN this operation will panic at runtime |
| } |
| const fn div_by_zero2() -> i32 { |
| 1 / (1 - 1) |
| //~^ WARN this operation will panic at runtime |
| } |
| const fn div_by_zero3() -> i32 { |
| 1 / (false as i32) |
| //~^ WARN this operation will panic at runtime |
| } |
| const fn oob() -> i32 { |
| [1, 2, 3][4] |
| //~^ WARN this operation will panic at runtime |
| } |
| |
| const fn mk_false() -> bool { false } |
| |
| // An actually used constant referencing failing promoteds in dead code. |
| // This needs to always work. |
| const Y: () = { |
| if mk_false() { |
| let _x: &'static u32 = &overflow(); |
| let _x: &'static i32 = &div_by_zero1(); |
| let _x: &'static i32 = &div_by_zero2(); |
| let _x: &'static i32 = &div_by_zero3(); |
| let _x: &'static i32 = &oob(); |
| } |
| () |
| }; |
| |
| fn main() { |
| let _y = Y; |
| } |