diff --git a/src/librustc_mir/const_eval.rs b/src/librustc_mir/const_eval.rs index 1ce32f8c0a85..2cfd058831f0 100644 --- a/src/librustc_mir/const_eval.rs +++ b/src/librustc_mir/const_eval.rs @@ -343,7 +343,11 @@ impl<'a, 'mir, 'tcx> interpret::Machine<'a, 'mir, 'tcx> type MemoryMap = FxHashMap, Allocation<()>)>; const STATIC_KIND: Option = None; // no copying of statics allowed - const ENFORCE_VALIDITY: bool = false; // for now, we don't + + #[inline(always)] + fn enforce_validity(_ecx: &EvalContext<'a, 'mir, 'tcx, Self>) -> bool { + false // for now, we don't enforce validity + } fn find_fn( ecx: &mut EvalContext<'a, 'mir, 'tcx, Self>, diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index bc613358152b..85a8376134aa 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -524,7 +524,7 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tc } // Validate the return value. if let Some(return_place) = frame.return_place { - if M::ENFORCE_VALIDITY { + if M::enforce_validity(self) { // Data got changed, better make sure it matches the type! // It is still possible that the return place held invalid data while // the function is running, but that's okay because nobody could have diff --git a/src/librustc_mir/interpret/machine.rs b/src/librustc_mir/interpret/machine.rs index a444f0bafd23..560698f3f57a 100644 --- a/src/librustc_mir/interpret/machine.rs +++ b/src/librustc_mir/interpret/machine.rs @@ -86,7 +86,7 @@ pub trait Machine<'a, 'mir, 'tcx>: Sized { const STATIC_KIND: Option; /// Whether to enforce the validity invariant - const ENFORCE_VALIDITY: bool; + fn enforce_validity(ecx: &EvalContext<'a, 'mir, 'tcx, Self>) -> bool; /// Called before a basic block terminator is executed. /// You can use this to detect endlessly running programs. diff --git a/src/librustc_mir/interpret/place.rs b/src/librustc_mir/interpret/place.rs index 923f0dc4c291..e4055947b642 100644 --- a/src/librustc_mir/interpret/place.rs +++ b/src/librustc_mir/interpret/place.rs @@ -607,7 +607,7 @@ where ) -> EvalResult<'tcx> { self.write_value_no_validate(src_val, dest)?; - if M::ENFORCE_VALIDITY { + if M::enforce_validity(self) { // Data got changed, better make sure it matches the type! self.validate_operand(self.place_to_op(dest)?, &mut vec![], None, /*const_mode*/false)?; } @@ -729,7 +729,7 @@ where ) -> EvalResult<'tcx> { self.copy_op_no_validate(src, dest)?; - if M::ENFORCE_VALIDITY { + if M::enforce_validity(self) { // Data got changed, better make sure it matches the type! self.validate_operand(self.place_to_op(dest)?, &mut vec![], None, /*const_mode*/false)?; } @@ -807,7 +807,7 @@ where PlaceTy::from(MPlaceTy { mplace: *dest, layout: src.layout }), )?; - if M::ENFORCE_VALIDITY { + if M::enforce_validity(self) { // Data got changed, better make sure it matches the type! self.validate_operand(dest.into(), &mut vec![], None, /*const_mode*/false)?; }