From 2a33fbff22c1145f59805aee0c4fa458d4242ebb Mon Sep 17 00:00:00 2001 From: Saleem Jaffer Date: Tue, 30 Jul 2019 13:18:36 +0530 Subject: [PATCH] addding an interp_error module --- src/librustc/mir/interpret/interp_error.rs | 20 ++++++++++++++++++++ src/librustc/mir/interpret/mod.rs | 1 + src/librustc_mir/interpret/cast.rs | 5 ++--- src/librustc_mir/interpret/eval_context.rs | 2 +- src/librustc_mir/interpret/operand.rs | 2 +- src/librustc_mir/interpret/terminator.rs | 5 ++--- src/librustc_mir/interpret/traits.rs | 6 +++--- 7 files changed, 30 insertions(+), 11 deletions(-) create mode 100644 src/librustc/mir/interpret/interp_error.rs diff --git a/src/librustc/mir/interpret/interp_error.rs b/src/librustc/mir/interpret/interp_error.rs new file mode 100644 index 00000000000..c5a7adf1b67 --- /dev/null +++ b/src/librustc/mir/interpret/interp_error.rs @@ -0,0 +1,20 @@ +//! macros to do something like `.ok_or_else(|| inval!(TooGeneric).into())` rather than +//! `.ok_or_else(|| InterpError::InvalidProgram(TooGeneric).into())` + +#[macro_export] +macro_rules! inval { + ($($tt:tt)*) => { + $crate::mir::interpret::InterpError::InvalidProgram( + $crate::mir::interpret::InvalidProgramInfo::$($tt)* + ) + }; +} + +#[macro_export] +macro_rules! unsup { + ($($tt:tt)*) => { + $crate::mir::interpret::InterpError::Unsupported( + $crate::mir::interpret::UnsupportedOpInfo::$($tt)* + ) + }; +} diff --git a/src/librustc/mir/interpret/mod.rs b/src/librustc/mir/interpret/mod.rs index e4bf8efad72..064ff831e4e 100644 --- a/src/librustc/mir/interpret/mod.rs +++ b/src/librustc/mir/interpret/mod.rs @@ -49,6 +49,7 @@ macro_rules! err_exhaust { mod value; mod allocation; mod pointer; +mod interp_error; pub use self::error::{ InterpErrorInfo, InterpResult, InterpError, AssertMessage, ConstEvalErr, struct_error, diff --git a/src/librustc_mir/interpret/cast.rs b/src/librustc_mir/interpret/cast.rs index c7a56c29b4b..4cb8351947b 100644 --- a/src/librustc_mir/interpret/cast.rs +++ b/src/librustc_mir/interpret/cast.rs @@ -7,7 +7,7 @@ use rustc_apfloat::ieee::{Single, Double}; use rustc_apfloat::{Float, FloatConvert}; use rustc::mir::interpret::{ - Scalar, InterpResult, Pointer, PointerArithmetic, InterpError, + Scalar, InterpResult, Pointer, PointerArithmetic, }; use rustc::mir::CastKind; @@ -74,7 +74,6 @@ pub fn cast( } Pointer(PointerCast::ReifyFnPointer) => { - use rustc::mir::interpret::InvalidProgramInfo::TooGeneric; // The src operand does not matter, just its type match src.layout.ty.sty { ty::FnDef(def_id, substs) => { @@ -86,7 +85,7 @@ pub fn cast( self.param_env, def_id, substs, - ).ok_or_else(|| InterpError::InvalidProgram(TooGeneric).into()); + ).ok_or_else(|| inval!(TooGeneric).into()); let fn_ptr = self.memory.create_fn_alloc(FnVal::Instance(instance?)); self.write_scalar(Scalar::Ptr(fn_ptr.into()), dest)?; } diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index 76de3b32fc7..c0e61184780 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -326,7 +326,7 @@ pub(super) fn resolve( self.param_env, def_id, substs, - ).ok_or_else(|| InterpError::InvalidProgram(InvalidProgramInfo::TooGeneric).into()) + ).ok_or_else(|| inval!(TooGeneric).into()) } pub fn load_mir( diff --git a/src/librustc_mir/interpret/operand.rs b/src/librustc_mir/interpret/operand.rs index 4dd308f5bf4..cdc89e7055c 100644 --- a/src/librustc_mir/interpret/operand.rs +++ b/src/librustc_mir/interpret/operand.rs @@ -637,7 +637,7 @@ pub fn read_discriminant( .find(|(_, var)| var.val == real_discr), _ => bug!("tagged layout for non-adt non-generator"), }.ok_or_else( - || InterpError::Unsupported(InvalidDiscriminant(raw_discr.erase_tag())) + || unsup!(InvalidDiscriminant(raw_discr.erase_tag())) )?; (real_discr, index.0) }, diff --git a/src/librustc_mir/interpret/terminator.rs b/src/librustc_mir/interpret/terminator.rs index b1706e72dd4..51ed156f6cf 100644 --- a/src/librustc_mir/interpret/terminator.rs +++ b/src/librustc_mir/interpret/terminator.rs @@ -7,9 +7,8 @@ use rustc_target::spec::abi::Abi; use super::{ - InterpResult, PointerArithmetic, InterpError, Scalar, + InterpResult, PointerArithmetic, Scalar, InterpCx, Machine, Immediate, OpTy, ImmTy, PlaceTy, MPlaceTy, StackPopCleanup, FnVal, - UnsupportedOpInfo, }; impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { @@ -221,7 +220,7 @@ fn pass_argument( return Ok(()); } let caller_arg = caller_arg.next() - .ok_or_else(|| InterpError::Unsupported(UnsupportedOpInfo::FunctionArgCountMismatch))?; + .ok_or_else(|| unsup!(FunctionArgCountMismatch)) ?; if rust_abi { debug_assert!(!caller_arg.layout.is_zst(), "ZSTs must have been already filtered out"); } diff --git a/src/librustc_mir/interpret/traits.rs b/src/librustc_mir/interpret/traits.rs index 677d6c89b38..71f2cfceaf2 100644 --- a/src/librustc_mir/interpret/traits.rs +++ b/src/librustc_mir/interpret/traits.rs @@ -1,8 +1,8 @@ use rustc::ty::{self, Ty, Instance}; use rustc::ty::layout::{Size, Align, LayoutOf}; -use rustc::mir::interpret::{Scalar, Pointer, InterpResult, PointerArithmetic, InvalidProgramInfo}; +use rustc::mir::interpret::{Scalar, Pointer, InterpResult, PointerArithmetic,}; -use super::{InterpCx, InterpError, Machine, MemoryKind, FnVal}; +use super::{InterpCx, Machine, MemoryKind, FnVal}; impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// Creates a dynamic vtable for the given type and vtable origin. This is used only for @@ -83,7 +83,7 @@ pub fn get_vtable( self.param_env, def_id, substs, - ).ok_or_else(|| InterpError::InvalidProgram(InvalidProgramInfo::TooGeneric))?; + ).ok_or_else(|| inval!(TooGeneric))?; let fn_ptr = self.memory.create_fn_alloc(FnVal::Instance(instance)); let method_ptr = vtable.offset(ptr_size * (3 + i as u64), self)?; self.memory -- 2.44.0