Change:
The lint should fire on the following code, but it does not: (This testcase now exists in-tree as a FIXME in .) Cc <!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --This issue has been assigned to via . <!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOT_END --
I'd like to take this. claim
I have some plans to follow-up on with some cleanup. That might at least partially resolve this issue here. So it's probably best to wait until after that is done.
All right, landed, so what I planned here is done. The remaining issue is about associated consts. The issue there is that fails, or maybe we are hitting an , but I have not tried further. The issue is all yours, :)
Great! I'll start investigating.
Never mind, that one is already fixed on beta.
got reverted in , so we have to reopen this.

Discussion:
return None; } <del> // FIXME we need to revisit this for #67176 if rvalue.needs_subst() { return None; } </del> // Perform any special handling for specific Rvalue types. // Generally, checks here fall into one of two categories: //   1. Additional checking to provide useful lints to the user

_ => {} } <ins> // FIXME we need to revisit this for #67176 if rvalue.needs_subst() { return None; } </ins> self.use_ecx(|this| { trace!("calling eval_rvalue_into_place(rvalue = {:?}, place = {:?})", rvalue, place); this.ecx.eval_rvalue_into_place(rvalue, place)?;

<del> error: this arithmetic operation will overflow --> $DIR/lint-exceeding-bitshifts.rs:22:13 </del> <ins> warning: this arithmetic operation will overflow --> $DIR/lint-exceeding-bitshifts.rs:18:20 </ins> | <del> LL |     let _ = x << 42; |             ^^^^^^^ attempt to shift left with overflow </del> <ins> LL |     const N: i32 = T::N << 42; |                    ^^^^^^^^^^ attempt to shift left with overflow </ins> | note: the lint level is defined here --> $DIR/lint-exceeding-bitshifts.rs:9:9 | <del> LL | #![deny(arithmetic_overflow, const_err)] </del> <ins> LL | #![warn(arithmetic_overflow, const_err)] </ins> |         ^^^^^^^^^^^^^^^^^^^ <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow --> $DIR/lint-exceeding-bitshifts.rs:22:13 | LL |     let _ = x << 42; |             ^^^^^^^ attempt to shift left with overflow warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:27:15 | LL |       let n = 1u8 << 8; |               ^^^^^^^^ attempt to shift left with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:29:15 | LL |       let n = 1u16 << 16; |               ^^^^^^^^^^ attempt to shift left with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:31:15 | LL |       let n = 1u32 << 32; |               ^^^^^^^^^^ attempt to shift left with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:33:15 | LL |       let n = 1u64 << 64; |               ^^^^^^^^^^ attempt to shift left with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:35:15 | LL |       let n = 1i8 << 8; |               ^^^^^^^^ attempt to shift left with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:37:15 | LL |       let n = 1i16 << 16; |               ^^^^^^^^^^ attempt to shift left with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:39:15 | LL |       let n = 1i32 << 32; |               ^^^^^^^^^^ attempt to shift left with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:41:15 | LL |       let n = 1i64 << 64; |               ^^^^^^^^^^ attempt to shift left with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:44:15 | LL |       let n = 1u8 >> 8; |               ^^^^^^^^ attempt to shift right with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:46:15 | LL |       let n = 1u16 >> 16; |               ^^^^^^^^^^ attempt to shift right with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:48:15 | LL |       let n = 1u32 >> 32; |               ^^^^^^^^^^ attempt to shift right with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:50:15 | LL |       let n = 1u64 >> 64; |               ^^^^^^^^^^ attempt to shift right with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:52:15 | LL |       let n = 1i8 >> 8; |               ^^^^^^^^ attempt to shift right with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:54:15 | LL |       let n = 1i16 >> 16; |               ^^^^^^^^^^ attempt to shift right with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:56:15 | LL |       let n = 1i32 >> 32; |               ^^^^^^^^^^ attempt to shift right with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:58:15 | LL |       let n = 1i64 >> 64; |               ^^^^^^^^^^ attempt to shift right with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:62:15 | LL |       let n = n << 8; |               ^^^^^^ attempt to shift left with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:64:15 | LL |       let n = 1u8 << -8; |               ^^^^^^^^^ attempt to shift left with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:69:15 | LL |       let n = 1u8 << (4+4); |               ^^^^^^^^^^^^ attempt to shift left with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:71:15 | LL |       let n = 1i64 >> [64][0]; |               ^^^^^^^^^^^^^^^ attempt to shift right with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:77:15 | LL |       let n = 1_isize << BITS; |               ^^^^^^^^^^^^^^^ attempt to shift left with overflow <del> error: this arithmetic operation will overflow </del> <ins> warning: this arithmetic operation will overflow </ins> --> $DIR/lint-exceeding-bitshifts.rs:78:15 | LL |       let n = 1_usize << BITS; |               ^^^^^^^^^^^^^^^ attempt to shift left with overflow <del> error: aborting due to 23 previous errors </del> <ins> warning: 24 warnings emitted </ins>

//[opt]compile-flags: -O //[opt_with_overflow_checks]compile-flags: -C overflow-checks=on -O <del> // build-fail </del> <ins> // build-pass </ins> #![crate_type="lib"] <del> #![deny(arithmetic_overflow, const_err)] </del> <ins> #![warn(arithmetic_overflow, const_err)] </ins> #![allow(unused_variables)] #![allow(dead_code)]

} impl<T: Foo> Foo for Vec<T> { <del> const N: i32 = T::N << 42; // FIXME this should warn </del> <ins> const N: i32 = T::N << 42; //~ WARN: arithmetic operation will overflow </ins> } pub fn foo(x: i32) { <del> let _ = x << 42; //~ ERROR: arithmetic operation will overflow </del> <ins> let _ = x << 42; //~ WARN: arithmetic operation will overflow </ins> } pub fn main() { let n = 1u8 << 7; <del> let n = 1u8 << 8;   //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1u8 << 8;   //~ WARN: arithmetic operation will overflow </ins> let n = 1u16 << 15; <del> let n = 1u16 << 16; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1u16 << 16; //~ WARN: arithmetic operation will overflow </ins> let n = 1u32 << 31; <del> let n = 1u32 << 32; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1u32 << 32; //~ WARN: arithmetic operation will overflow </ins> let n = 1u64 << 63; <del> let n = 1u64 << 64; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1u64 << 64; //~ WARN: arithmetic operation will overflow </ins> let n = 1i8 << 7; <del> let n = 1i8 << 8;   //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1i8 << 8;   //~ WARN: arithmetic operation will overflow </ins> let n = 1i16 << 15; <del> let n = 1i16 << 16; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1i16 << 16; //~ WARN: arithmetic operation will overflow </ins> let n = 1i32 << 31; <del> let n = 1i32 << 32; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1i32 << 32; //~ WARN: arithmetic operation will overflow </ins> let n = 1i64 << 63; <del> let n = 1i64 << 64; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1i64 << 64; //~ WARN: arithmetic operation will overflow </ins> let n = 1u8 >> 7; <del> let n = 1u8 >> 8;   //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1u8 >> 8;   //~ WARN: arithmetic operation will overflow </ins> let n = 1u16 >> 15; <del> let n = 1u16 >> 16; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1u16 >> 16; //~ WARN: arithmetic operation will overflow </ins> let n = 1u32 >> 31; <del> let n = 1u32 >> 32; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1u32 >> 32; //~ WARN: arithmetic operation will overflow </ins> let n = 1u64 >> 63; <del> let n = 1u64 >> 64; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1u64 >> 64; //~ WARN: arithmetic operation will overflow </ins> let n = 1i8 >> 7; <del> let n = 1i8 >> 8;   //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1i8 >> 8;   //~ WARN: arithmetic operation will overflow </ins> let n = 1i16 >> 15; <del> let n = 1i16 >> 16; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1i16 >> 16; //~ WARN: arithmetic operation will overflow </ins> let n = 1i32 >> 31; <del> let n = 1i32 >> 32; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1i32 >> 32; //~ WARN: arithmetic operation will overflow </ins> let n = 1i64 >> 63; <del> let n = 1i64 >> 64; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1i64 >> 64; //~ WARN: arithmetic operation will overflow </ins> let n = 1u8; let n = n << 7; <del> let n = n << 8; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = n << 8; //~ WARN: arithmetic operation will overflow </ins> <del> let n = 1u8 << -8; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1u8 << -8; //~ WARN: arithmetic operation will overflow </ins> let n = 1i8<<(1isize+-1); let n = 1u8 << (4+3); <del> let n = 1u8 << (4+4); //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1u8 << (4+4); //~ WARN: arithmetic operation will overflow </ins> let n = 1i64 >> [63][0]; <del> let n = 1i64 >> [64][0]; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1i64 >> [64][0]; //~ WARN: arithmetic operation will overflow </ins> #[cfg(target_pointer_width = "32")] const BITS: usize = 32; #[cfg(target_pointer_width = "64")] const BITS: usize = 64; <del> let n = 1_isize << BITS; //~ ERROR: arithmetic operation will overflow let n = 1_usize << BITS; //~ ERROR: arithmetic operation will overflow </del> <ins> let n = 1_isize << BITS; //~ WARN: arithmetic operation will overflow let n = 1_usize << BITS; //~ WARN: arithmetic operation will overflow </ins> }