Rollup merge of #127275 - RalfJung:offset-from-isize-min, r=Amanieu
offset_from, offset: clearly separate safety requirements the user needs to prove from corollaries that automatically follow By landing https://github.com/rust-lang/rust/pull/116675 we decided that objects larger than `isize::MAX` cannot exist in the address space of a Rust program, which lets us simplify these rules. For `offset_from`, we can even state that the *absolute* distance fits into an `isize`, and therefore exclude `isize::MIN`. This PR also changes Miri to treat an `isize::MIN` difference like the other isize-overflowing cases.
This commit is contained in:
commit
2137d19ef6
6 changed files with 139 additions and 272 deletions
|
@ -301,9 +301,9 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
|||
}
|
||||
// The signed form of the intrinsic allows this. If we interpret the
|
||||
// difference as isize, we'll get the proper signed difference. If that
|
||||
// seems *positive*, they were more than isize::MAX apart.
|
||||
// seems *positive* or equal to isize::MIN, they were more than isize::MAX apart.
|
||||
let dist = val.to_target_isize(self)?;
|
||||
if dist >= 0 {
|
||||
if dist >= 0 || i128::from(dist) == self.pointer_size().signed_int_min() {
|
||||
throw_ub_custom!(
|
||||
fluent::const_eval_offset_from_underflow,
|
||||
name = intrinsic_name,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue