| // 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. |
| |
| //@ build-pass (FIXME(62277): could be check-pass?) |
| //@ revisions: cfail1 cfail2 cfail3 |
| //@ compile-flags: -Z query-dep-graph -C debug-assertions -O |
| |
| #![allow(warnings)] |
| #![feature(rustc_attrs)] |
| #![crate_type="rlib"] |
| |
| |
| // Indexing expression |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")] |
| #[rustc_clean(cfg="cfail3")] |
| pub fn indexing(slice: &[u8]) -> u8 { |
| #[cfg(cfail1)] |
| { |
| slice[100] |
| } |
| #[cfg(not(cfail1))] |
| { |
| slice[100] |
| } |
| } |
| |
| |
| // Arithmetic overflow plus |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")] |
| #[rustc_clean(cfg="cfail3")] |
| pub fn arithmetic_overflow_plus(val: i32) -> i32 { |
| #[cfg(cfail1)] |
| { |
| val + 1 |
| } |
| #[cfg(not(cfail1))] |
| { |
| val + 1 |
| } |
| } |
| |
| |
| // Arithmetic overflow minus |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")] |
| #[rustc_clean(cfg="cfail3")] |
| pub fn arithmetic_overflow_minus(val: i32) -> i32 { |
| #[cfg(cfail1)] |
| { |
| val - 1 |
| } |
| #[cfg(not(cfail1))] |
| { |
| val - 1 |
| } |
| } |
| |
| |
| // Arithmetic overflow mult |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")] |
| #[rustc_clean(cfg="cfail3")] |
| pub fn arithmetic_overflow_mult(val: i32) -> i32 { |
| #[cfg(cfail1)] |
| { |
| val * 2 |
| } |
| #[cfg(not(cfail1))] |
| { |
| val * 2 |
| } |
| } |
| |
| |
| // Arithmetic overflow negation |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")] |
| #[rustc_clean(cfg="cfail3")] |
| pub fn arithmetic_overflow_negation(val: i32) -> i32 { |
| #[cfg(cfail1)] |
| { |
| -val |
| } |
| #[cfg(not(cfail1))] |
| { |
| -val |
| } |
| } |
| |
| |
| // Division by zero |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")] |
| #[rustc_clean(cfg="cfail3")] |
| pub fn division_by_zero(val: i32) -> i32 { |
| #[cfg(cfail1)] |
| { |
| 2 / val |
| } |
| #[cfg(not(cfail1))] |
| { |
| 2 / val |
| } |
| } |
| |
| // Division by zero |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")] |
| #[rustc_clean(cfg="cfail3")] |
| pub fn mod_by_zero(val: i32) -> i32 { |
| #[cfg(cfail1)] |
| { |
| 2 % val |
| } |
| #[cfg(not(cfail1))] |
| { |
| 2 % val |
| } |
| } |
| |
| |
| // shift left |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")] |
| #[rustc_clean(cfg="cfail3")] |
| pub fn shift_left(val: i32, shift: usize) -> i32 { |
| #[cfg(cfail1)] |
| { |
| val << shift |
| } |
| #[cfg(not(cfail1))] |
| { |
| val << shift |
| } |
| } |
| |
| |
| // shift right |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")] |
| #[rustc_clean(cfg="cfail3")] |
| pub fn shift_right(val: i32, shift: usize) -> i32 { |
| #[cfg(cfail1)] |
| { |
| val >> shift |
| } |
| #[cfg(not(cfail1))] |
| { |
| val >> shift |
| } |
| } |