mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 12:54:58 +00:00
Fix overflow checking in shift operator
This commit is contained in:
parent
bb85a980e0
commit
15a0da6f30
2 changed files with 7 additions and 1 deletions
|
@ -108,6 +108,7 @@ fn bit_op() {
|
||||||
check_fail(r#"const GOAL: i8 = 1 << 8"#, |e| {
|
check_fail(r#"const GOAL: i8 = 1 << 8"#, |e| {
|
||||||
e == ConstEvalError::MirEvalError(MirEvalError::Panic("Overflow in Shl".to_string()))
|
e == ConstEvalError::MirEvalError(MirEvalError::Panic("Overflow in Shl".to_string()))
|
||||||
});
|
});
|
||||||
|
check_number(r#"const GOAL: i32 = 100000000i32 << 11"#, (100000000i32 << 11) as i128);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -1037,13 +1037,18 @@ impl Evaluator<'_> {
|
||||||
BinOp::Shr => l128.checked_shr(shift_amount),
|
BinOp::Shr => l128.checked_shr(shift_amount),
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
|
if shift_amount as usize >= lc.len() * 8 {
|
||||||
|
return Err(MirEvalError::Panic(format!(
|
||||||
|
"Overflow in {op:?}"
|
||||||
|
)));
|
||||||
|
}
|
||||||
if let Some(r) = r {
|
if let Some(r) = r {
|
||||||
break 'b r;
|
break 'b r;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return Err(MirEvalError::Panic(format!("Overflow in {op:?}")));
|
return Err(MirEvalError::Panic(format!("Overflow in {op:?}")));
|
||||||
};
|
};
|
||||||
check_overflow(r)?
|
Owned(r.to_le_bytes()[..lc.len()].to_vec())
|
||||||
}
|
}
|
||||||
BinOp::Offset => not_supported!("offset binop"),
|
BinOp::Offset => not_supported!("offset binop"),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue