diff --git a/src/librustc/ich/impls_ty.rs b/src/librustc/ich/impls_ty.rs index db9fc005f2175..9fddd153598cd 100644 --- a/src/librustc/ich/impls_ty.rs +++ b/src/librustc/ich/impls_ty.rs @@ -532,7 +532,6 @@ for ::mir::interpret::EvalError<'gcx> { InvalidPointerMath | ReadUndefBytes | DeadLocal | - ExecutionTimeLimitReached | StackFrameLimitReached | OutOfTls | TlsOutOfBounds | diff --git a/src/librustc/mir/interpret/error.rs b/src/librustc/mir/interpret/error.rs index 9e69990f22c0d..b919f4d15a840 100644 --- a/src/librustc/mir/interpret/error.rs +++ b/src/librustc/mir/interpret/error.rs @@ -65,7 +65,6 @@ pub enum EvalErrorKind<'tcx> { Intrinsic(String), OverflowingMath, InvalidChar(u128), - ExecutionTimeLimitReached, StackFrameLimitReached, OutOfTls, TlsOutOfBounds, @@ -188,8 +187,6 @@ impl<'tcx> Error for EvalError<'tcx> { "mir not found", InvalidChar(..) => "tried to interpret an invalid 32-bit value as a char", - ExecutionTimeLimitReached => - "the expression was too complex to be evaluated or resulted in an infinite loop", StackFrameLimitReached => "reached the configured maximum number of stack frames", OutOfTls => diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 77cf50a8341ed..3afddbdfaed7f 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -108,8 +108,6 @@ pub struct Session { /// The maximum number of stackframes allowed in const eval pub const_eval_stack_frame_limit: Cell, - /// The maximum number miri steps per constant - pub const_eval_step_limit: Cell, /// The metadata::creader module may inject an allocator/panic_runtime /// dependency if it didn't already find one, and this tracks what was @@ -1146,7 +1144,6 @@ pub fn build_session_( recursion_limit: Cell::new(64), type_length_limit: Cell::new(1048576), const_eval_stack_frame_limit: Cell::new(100), - const_eval_step_limit: Cell::new(1_000_000), next_node_id: Cell::new(NodeId::new(1)), injected_allocator: Cell::new(None), allocator_kind: Cell::new(None), diff --git a/src/librustc/ty/structural_impls.rs b/src/librustc/ty/structural_impls.rs index 8cf662ccaea92..7b4b7082bb6ce 100644 --- a/src/librustc/ty/structural_impls.rs +++ b/src/librustc/ty/structural_impls.rs @@ -509,7 +509,6 @@ impl<'a, 'tcx> Lift<'tcx> for interpret::EvalError<'a> { Intrinsic(ref s) => Intrinsic(s.clone()), OverflowingMath => OverflowingMath, InvalidChar(c) => InvalidChar(c), - ExecutionTimeLimitReached => ExecutionTimeLimitReached, StackFrameLimitReached => StackFrameLimitReached, OutOfTls => OutOfTls, TlsOutOfBounds => TlsOutOfBounds, diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index b8bfcd756cd23..7fa33231f3302 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -45,7 +45,7 @@ pub struct EvalContext<'a, 'mir, 'tcx: 'a + 'mir, M: Machine<'mir, 'tcx>> { /// The maximum number of terminators that may be evaluated. /// This prevents infinite loops and huge computations from freezing up const eval. /// Remove once halting problem is solved. - pub(crate) steps_remaining: usize, + pub(crate) terminators_remaining: usize, } /// A stack frame. @@ -195,7 +195,7 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M memory: Memory::new(tcx, memory_data), stack: Vec::new(), stack_limit: tcx.sess.const_eval_stack_frame_limit.get(), - steps_remaining: tcx.sess.const_eval_step_limit.get(), + terminators_remaining: 1_000_000, } } @@ -538,7 +538,7 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M } Aggregate(ref kind, ref operands) => { - self.inc_step_counter_and_check_limit(operands.len())?; + self.inc_step_counter_and_check_limit(operands.len()); let (dest, active_field_index) = match **kind { mir::AggregateKind::Adt(adt_def, variant_index, _, active_field_index) => { diff --git a/src/librustc_mir/interpret/step.rs b/src/librustc_mir/interpret/step.rs index a22572ec687c3..554d87a04e2f8 100644 --- a/src/librustc_mir/interpret/step.rs +++ b/src/librustc_mir/interpret/step.rs @@ -8,12 +8,12 @@ use rustc::mir::interpret::EvalResult; use super::{EvalContext, Machine}; impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> { - pub fn inc_step_counter_and_check_limit(&mut self, n: usize) -> EvalResult<'tcx> { - self.steps_remaining = self.steps_remaining.saturating_sub(n); - if self.steps_remaining > 0 { - Ok(()) - } else { - err!(ExecutionTimeLimitReached) + pub fn inc_step_counter_and_check_limit(&mut self, n: usize) { + self.terminators_remaining = self.terminators_remaining.saturating_sub(n); + if self.terminators_remaining == 0 { + // FIXME(#49980): make this warning a lint + self.tcx.sess.span_warn(self.frame().span, "Constant evaluating a complex constant, this might take some time"); + self.terminators_remaining = 1_000_000; } } @@ -36,7 +36,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> { return Ok(true); } - self.inc_step_counter_and_check_limit(1)?; + self.inc_step_counter_and_check_limit(1); let terminator = basic_block.terminator(); assert_eq!(old_frames, self.cur_frame());