Auto merge of #9464 - lukaslueg:issue9463, r=dswij
Don't panic on invalid shift while constfolding Instead of panicking on invalid shifts while folding constants we simply give up. Fixes #9463 Notice the "attempt to shift right by `1316134912_u32`", which seems weird. AFAICS it comes from rustc itself. changelog: none
This commit is contained in:
commit
7b8c4a9e83
@ -501,8 +501,8 @@ fn binop(&mut self, op: BinOp, left: &Expr<'_>, right: &Expr<'_>) -> Option<Cons
|
||||
BinOpKind::Mul => l.checked_mul(r).map(zext),
|
||||
BinOpKind::Div if r != 0 => l.checked_div(r).map(zext),
|
||||
BinOpKind::Rem if r != 0 => l.checked_rem(r).map(zext),
|
||||
BinOpKind::Shr => l.checked_shr(r.try_into().expect("invalid shift")).map(zext),
|
||||
BinOpKind::Shl => l.checked_shl(r.try_into().expect("invalid shift")).map(zext),
|
||||
BinOpKind::Shr => l.checked_shr(r.try_into().ok()?).map(zext),
|
||||
BinOpKind::Shl => l.checked_shl(r.try_into().ok()?).map(zext),
|
||||
BinOpKind::BitXor => Some(zext(l ^ r)),
|
||||
BinOpKind::BitOr => Some(zext(l | r)),
|
||||
BinOpKind::BitAnd => Some(zext(l & r)),
|
||||
@ -521,8 +521,8 @@ fn binop(&mut self, op: BinOp, left: &Expr<'_>, right: &Expr<'_>) -> Option<Cons
|
||||
BinOpKind::Mul => l.checked_mul(r).map(Constant::Int),
|
||||
BinOpKind::Div => l.checked_div(r).map(Constant::Int),
|
||||
BinOpKind::Rem => l.checked_rem(r).map(Constant::Int),
|
||||
BinOpKind::Shr => l.checked_shr(r.try_into().expect("shift too large")).map(Constant::Int),
|
||||
BinOpKind::Shl => l.checked_shl(r.try_into().expect("shift too large")).map(Constant::Int),
|
||||
BinOpKind::Shr => l.checked_shr(r.try_into().ok()?).map(Constant::Int),
|
||||
BinOpKind::Shl => l.checked_shl(r.try_into().ok()?).map(Constant::Int),
|
||||
BinOpKind::BitXor => Some(Constant::Int(l ^ r)),
|
||||
BinOpKind::BitOr => Some(Constant::Int(l | r)),
|
||||
BinOpKind::BitAnd => Some(Constant::Int(l & r)),
|
||||
|
5
tests/ui/crashes/ice-9463.rs
Normal file
5
tests/ui/crashes/ice-9463.rs
Normal file
@ -0,0 +1,5 @@
|
||||
#![deny(arithmetic_overflow, const_err)]
|
||||
fn main() {
|
||||
let _x = -1_i32 >> -1;
|
||||
let _y = 1u32 >> 10000000000000u32;
|
||||
}
|
29
tests/ui/crashes/ice-9463.stderr
Normal file
29
tests/ui/crashes/ice-9463.stderr
Normal file
@ -0,0 +1,29 @@
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/ice-9463.rs:3:14
|
||||
|
|
||||
LL | let _x = -1_i32 >> -1;
|
||||
| ^^^^^^^^^^^^ attempt to shift right by `-1_i32`, which would overflow
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/ice-9463.rs:1:9
|
||||
|
|
||||
LL | #![deny(arithmetic_overflow, const_err)]
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/ice-9463.rs:4:14
|
||||
|
|
||||
LL | let _y = 1u32 >> 10000000000000u32;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to shift right by `1316134912_u32`, which would overflow
|
||||
|
||||
error: literal out of range for `u32`
|
||||
--> $DIR/ice-9463.rs:4:22
|
||||
|
|
||||
LL | let _y = 1u32 >> 10000000000000u32;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[deny(overflowing_literals)]` on by default
|
||||
= note: the literal `10000000000000u32` does not fit into the type `u32` whose range is `0..=4294967295`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
Loading…
Reference in New Issue
Block a user