interpret: make overflowing binops just normal binops
This commit is contained in:
parent
9cb6bb8599
commit
c0b4b454c3
40 changed files with 323 additions and 349 deletions
|
@ -1,19 +1,22 @@
|
|||
use super::{AllocId, AllocRange, ConstAllocation, Pointer, Scalar};
|
||||
use std::borrow::Cow;
|
||||
use std::{any::Any, backtrace::Backtrace, fmt};
|
||||
|
||||
use crate::error;
|
||||
use crate::mir::{ConstAlloc, ConstValue};
|
||||
use crate::ty::{self, layout, tls, Ty, TyCtxt, ValTree};
|
||||
use either::Either;
|
||||
|
||||
use rustc_ast_ir::Mutability;
|
||||
use rustc_data_structures::sync::Lock;
|
||||
use rustc_errors::{DiagArgName, DiagArgValue, DiagMessage, ErrorGuaranteed, IntoDiagArg};
|
||||
use rustc_macros::{HashStable, TyDecodable, TyEncodable};
|
||||
use rustc_session::CtfeBacktrace;
|
||||
use rustc_span::Symbol;
|
||||
use rustc_span::{def_id::DefId, Span, DUMMY_SP};
|
||||
use rustc_target::abi::{call, Align, Size, VariantIdx, WrappingRange};
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::{any::Any, backtrace::Backtrace, fmt};
|
||||
use super::{AllocId, AllocRange, ConstAllocation, Pointer, Scalar};
|
||||
|
||||
use crate::error;
|
||||
use crate::mir::{ConstAlloc, ConstValue};
|
||||
use crate::ty::{self, layout, tls, Ty, TyCtxt, ValTree};
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, HashStable, TyEncodable, TyDecodable)]
|
||||
pub enum ErrorHandled {
|
||||
|
@ -310,6 +313,10 @@ pub enum UndefinedBehaviorInfo<'tcx> {
|
|||
RemainderOverflow,
|
||||
/// Overflowing inbounds pointer arithmetic.
|
||||
PointerArithOverflow,
|
||||
/// Overflow in arithmetic that may not overflow.
|
||||
ArithOverflow { intrinsic: Symbol },
|
||||
/// Shift by too much.
|
||||
ShiftOverflow { intrinsic: Symbol, shift_amount: Either<u128, i128> },
|
||||
/// Invalid metadata in a wide pointer
|
||||
InvalidMeta(InvalidMetaKind),
|
||||
/// Reading a C string that does not end within its allocation.
|
||||
|
|
|
@ -297,9 +297,9 @@ impl BorrowKind {
|
|||
impl BinOp {
|
||||
pub fn to_hir_binop(self) -> hir::BinOpKind {
|
||||
match self {
|
||||
BinOp::Add => hir::BinOpKind::Add,
|
||||
BinOp::Sub => hir::BinOpKind::Sub,
|
||||
BinOp::Mul => hir::BinOpKind::Mul,
|
||||
BinOp::Add | BinOp::AddWithOverflow => hir::BinOpKind::Add,
|
||||
BinOp::Sub | BinOp::SubWithOverflow => hir::BinOpKind::Sub,
|
||||
BinOp::Mul | BinOp::MulWithOverflow => hir::BinOpKind::Mul,
|
||||
BinOp::Div => hir::BinOpKind::Div,
|
||||
BinOp::Rem => hir::BinOpKind::Rem,
|
||||
BinOp::BitXor => hir::BinOpKind::BitXor,
|
||||
|
@ -314,9 +314,6 @@ impl BinOp {
|
|||
BinOp::Le => hir::BinOpKind::Le,
|
||||
BinOp::Ge => hir::BinOpKind::Ge,
|
||||
BinOp::Cmp
|
||||
| BinOp::AddWithOverflow
|
||||
| BinOp::SubWithOverflow
|
||||
| BinOp::MulWithOverflow
|
||||
| BinOp::AddUnchecked
|
||||
| BinOp::SubUnchecked
|
||||
| BinOp::MulUnchecked
|
||||
|
@ -338,6 +335,11 @@ impl BinOp {
|
|||
})
|
||||
}
|
||||
|
||||
/// Returns whether this is a `FooWithOverflow`
|
||||
pub fn is_overflowing(self) -> bool {
|
||||
self.overflowing_to_wrapping().is_some()
|
||||
}
|
||||
|
||||
/// If this is a `Foo`, return `Some(FooWithOverflow)`.
|
||||
pub fn wrapping_to_overflowing(self) -> Option<BinOp> {
|
||||
Some(match self {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue