diff --git a/src/librustc/ich/impls_ty.rs b/src/librustc/ich/impls_ty.rs index b9d896166fde2..b12bb5bbff338 100644 --- a/src/librustc/ich/impls_ty.rs +++ b/src/librustc/ich/impls_ty.rs @@ -468,9 +468,9 @@ for ::mir::interpret::EvalError<'gcx> { hasher: &mut StableHasher) { use mir::interpret::EvalErrorKind::*; - mem::discriminant(&self.kind).hash_stable(hcx, hasher); + mem::discriminant(&*self.kind).hash_stable(hcx, hasher); - match self.kind { + match *self.kind { DanglingPointerDeref | DoubleFree | InvalidMemoryAccess | diff --git a/src/librustc/mir/interpret/error.rs b/src/librustc/mir/interpret/error.rs index 977e617968aa4..702fd85794fff 100644 --- a/src/librustc/mir/interpret/error.rs +++ b/src/librustc/mir/interpret/error.rs @@ -1,5 +1,6 @@ use std::error::Error; use std::{fmt, env}; +use std::rc::Rc; use mir; use ty::{FnSig, Ty, layout}; @@ -14,7 +15,7 @@ use backtrace::Backtrace; #[derive(Debug, Clone)] pub struct EvalError<'tcx> { - pub kind: EvalErrorKind<'tcx>, + pub kind: Rc>, pub backtrace: Option, } @@ -25,7 +26,7 @@ impl<'tcx> From> for EvalError<'tcx> { _ => None }; EvalError { - kind, + kind: Rc::new(kind), backtrace, } } @@ -131,7 +132,7 @@ pub type EvalResult<'tcx, T = ()> = Result>; impl<'tcx> Error for EvalError<'tcx> { fn description(&self) -> &str { use self::EvalErrorKind::*; - match self.kind { + match *self.kind { MachineError(ref inner) => inner, FunctionPointerTyMismatch(..) => "tried to call a function through a function pointer of a different type", @@ -252,7 +253,7 @@ impl<'tcx> Error for EvalError<'tcx> { impl<'tcx> fmt::Display for EvalError<'tcx> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { use self::EvalErrorKind::*; - match self.kind { + match *self.kind { PointerOutOfBounds { ptr, access, allocation_size } => { write!(f, "{} at offset {}, outside bounds of allocation {} which has size {}", if access { "memory access" } else { "pointer computed" }, diff --git a/src/librustc/ty/structural_impls.rs b/src/librustc/ty/structural_impls.rs index 33964b1092520..93024d51f2b48 100644 --- a/src/librustc/ty/structural_impls.rs +++ b/src/librustc/ty/structural_impls.rs @@ -612,7 +612,7 @@ impl<'a, 'tcx> Lift<'tcx> for interpret::EvalError<'a> { type Lifted = interpret::EvalError<'tcx>; fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option { use ::mir::interpret::EvalErrorKind::*; - let kind = match self.kind { + let kind = match *self.kind { MachineError(ref err) => MachineError(err.clone()), FunctionPointerTyMismatch(a, b) => FunctionPointerTyMismatch( tcx.lift(&a)?, @@ -712,7 +712,7 @@ impl<'a, 'tcx> Lift<'tcx> for interpret::EvalError<'a> { TypeckError => TypeckError, }; Some(interpret::EvalError { - kind, + kind: Rc::new(kind), backtrace: self.backtrace.clone(), }) }