| // This test case tests the incremental compilation hash (ICH) implementation | |
| // for exprs that can panic at runtime (e.g., because of bounds checking). For | |
| // these expressions an error message containing their source location is | |
| // generated, so their hash must always depend on their location in the source | |
| // code, not just when debuginfo is enabled. | |
| // The general pattern followed here is: Change one thing between rev1 and rev2 | |
| // and make sure that the hash has changed, then change nothing between rev2 and | |
| // rev3 and make sure that the hash has not changed. | |
| //@ revisions: bpass1 bpass2 bpass3 | |
| //@ compile-flags: -Z query-dep-graph -C debug-assertions -O | |
| //@ ignore-backends: gcc | |
| // FIXME(#62277): could be check-pass? | |
| #![allow(warnings)] | |
| #![feature(rustc_attrs)] | |
| #![crate_type="rlib"] | |
| // Indexing expression | |
| #[rustc_clean(cfg="bpass2", except="hir_owner,optimized_mir")] | |
| #[rustc_clean(cfg="bpass3")] | |
| pub fn indexing(slice: &[u8]) -> u8 { | |
| #[cfg(bpass1)] | |
| { | |
| slice[100] | |
| } | |
| #[cfg(not(bpass1))] | |
| { | |
| slice[100] | |
| } | |
| } | |
| // Arithmetic overflow plus | |
| #[rustc_clean(cfg="bpass2", except="hir_owner,optimized_mir")] | |
| #[rustc_clean(cfg="bpass3")] | |
| pub fn arithmetic_overflow_plus(val: i32) -> i32 { | |
| #[cfg(bpass1)] | |
| { | |
| val + 1 | |
| } | |
| #[cfg(not(bpass1))] | |
| { | |
| val + 1 | |
| } | |
| } | |
| // Arithmetic overflow minus | |
| #[rustc_clean(cfg="bpass2", except="hir_owner,optimized_mir")] | |
| #[rustc_clean(cfg="bpass3")] | |
| pub fn arithmetic_overflow_minus(val: i32) -> i32 { | |
| #[cfg(bpass1)] | |
| { | |
| val - 1 | |
| } | |
| #[cfg(not(bpass1))] | |
| { | |
| val - 1 | |
| } | |
| } | |
| // Arithmetic overflow mult | |
| #[rustc_clean(cfg="bpass2", except="hir_owner,optimized_mir")] | |
| #[rustc_clean(cfg="bpass3")] | |
| pub fn arithmetic_overflow_mult(val: i32) -> i32 { | |
| #[cfg(bpass1)] | |
| { | |
| val * 2 | |
| } | |
| #[cfg(not(bpass1))] | |
| { | |
| val * 2 | |
| } | |
| } | |
| // Arithmetic overflow negation | |
| #[rustc_clean(cfg="bpass2", except="hir_owner,optimized_mir")] | |
| #[rustc_clean(cfg="bpass3")] | |
| pub fn arithmetic_overflow_negation(val: i32) -> i32 { | |
| #[cfg(bpass1)] | |
| { | |
| -val | |
| } | |
| #[cfg(not(bpass1))] | |
| { | |
| -val | |
| } | |
| } | |
| // Division by zero | |
| #[rustc_clean(cfg="bpass2", except="hir_owner,optimized_mir")] | |
| #[rustc_clean(cfg="bpass3")] | |
| pub fn division_by_zero(val: i32) -> i32 { | |
| #[cfg(bpass1)] | |
| { | |
| 2 / val | |
| } | |
| #[cfg(not(bpass1))] | |
| { | |
| 2 / val | |
| } | |
| } | |
| // Division by zero | |
| #[rustc_clean(cfg="bpass2", except="hir_owner,optimized_mir")] | |
| #[rustc_clean(cfg="bpass3")] | |
| pub fn mod_by_zero(val: i32) -> i32 { | |
| #[cfg(bpass1)] | |
| { | |
| 2 % val | |
| } | |
| #[cfg(not(bpass1))] | |
| { | |
| 2 % val | |
| } | |
| } | |
| // shift left | |
| #[rustc_clean(cfg="bpass2", except="hir_owner,optimized_mir")] | |
| #[rustc_clean(cfg="bpass3")] | |
| pub fn shift_left(val: i32, shift: usize) -> i32 { | |
| #[cfg(bpass1)] | |
| { | |
| val << shift | |
| } | |
| #[cfg(not(bpass1))] | |
| { | |
| val << shift | |
| } | |
| } | |
| // shift right | |
| #[rustc_clean(cfg="bpass2", except="hir_owner,optimized_mir")] | |
| #[rustc_clean(cfg="bpass3")] | |
| pub fn shift_right(val: i32, shift: usize) -> i32 { | |
| #[cfg(bpass1)] | |
| { | |
| val >> shift | |
| } | |
| #[cfg(not(bpass1))] | |
| { | |
| val >> shift | |
| } | |
| } |