Skip to content

Commit 253ac3f

Browse files
committed
Report a best guess span if no stack is available anymore
1 parent cfd11fb commit 253ac3f

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

src/librustc_mir/interpret/const_eval.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ pub fn mk_borrowck_eval_cx<'a, 'mir, 'tcx>(
2424
) -> EvalResult<'tcx, EvalContext<'a, 'mir, 'tcx, CompileTimeEvaluator>> {
2525
debug!("mk_borrowck_eval_cx: {:?}", instance);
2626
let param_env = tcx.param_env(instance.def_id());
27-
let mut ecx = EvalContext::new(tcx, param_env, CompileTimeEvaluator, ());
27+
let mut ecx = EvalContext::new(tcx, param_env, CompileTimeEvaluator, (), span);
2828
// insert a stack frame so any queries have the correct substs
2929
ecx.push_stack_frame(
3030
instance,
@@ -42,7 +42,8 @@ pub fn mk_eval_cx<'a, 'tcx>(
4242
param_env: ty::ParamEnv<'tcx>,
4343
) -> EvalResult<'tcx, EvalContext<'a, 'tcx, 'tcx, CompileTimeEvaluator>> {
4444
debug!("mk_eval_cx: {:?}, {:?}", instance, param_env);
45-
let mut ecx = EvalContext::new(tcx, param_env, CompileTimeEvaluator, ());
45+
let span = tcx.def_span(instance.def_id());
46+
let mut ecx = EvalContext::new(tcx, param_env, CompileTimeEvaluator, (), span);
4647
let mir = ecx.load_mir(instance.def)?;
4748
// insert a stack frame so any queries have the correct substs
4849
ecx.push_stack_frame(
@@ -93,10 +94,10 @@ fn eval_body_and_ecx<'a, 'mir, 'tcx>(
9394
param_env: ty::ParamEnv<'tcx>,
9495
) -> (EvalResult<'tcx, (Value, Pointer, Ty<'tcx>)>, EvalContext<'a, 'mir, 'tcx, CompileTimeEvaluator>) {
9596
debug!("eval_body: {:?}, {:?}", cid, param_env);
96-
let mut ecx = EvalContext::new(tcx, param_env, CompileTimeEvaluator, ());
9797
// we start out with the best span we have
9898
// and try improving it down the road when more information is available
9999
let mut span = tcx.def_span(cid.instance.def_id());
100+
let mut ecx = EvalContext::new(tcx, param_env, CompileTimeEvaluator, (), mir.map(|mir| mir.span).unwrap_or(span));
100101
let res = (|| {
101102
let mut mir = match mir {
102103
Some(mir) => mir,

src/librustc_mir/interpret/eval_context.rs

+15-5
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ pub struct EvalContext<'a, 'mir, 'tcx: 'a + 'mir, M: Machine<'mir, 'tcx>> {
4545
/// This prevents infinite loops and huge computations from freezing up const eval.
4646
/// Remove once halting problem is solved.
4747
pub(crate) steps_remaining: usize,
48+
49+
/// The span that is used if no more stack frames are available
50+
///
51+
/// This happens after successful evaluation when the result is inspected
52+
root_span: codemap::Span,
4853
}
4954

5055
/// A stack frame.
@@ -186,6 +191,7 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
186191
param_env: ty::ParamEnv<'tcx>,
187192
machine: M,
188193
memory_data: M::MemoryData,
194+
root_span: codemap::Span,
189195
) -> Self {
190196
EvalContext {
191197
machine,
@@ -195,6 +201,7 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
195201
stack: Vec::new(),
196202
stack_limit: tcx.sess.const_eval_stack_frame_limit.get(),
197203
steps_remaining: tcx.sess.const_eval_step_limit.get(),
204+
root_span,
198205
}
199206
}
200207

@@ -1590,12 +1597,15 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
15901597
};
15911598
frames.push(FrameInfo { span, location });
15921599
}
1593-
let frame = self.frame();
1594-
let bb = &frame.mir.basic_blocks()[frame.block];
1595-
let span = if let Some(stmt) = bb.statements.get(frame.stmt) {
1596-
stmt.source_info.span
1600+
let span = if let Some(frame) = self.stack().last() {
1601+
let bb = &frame.mir.basic_blocks()[frame.block];
1602+
if let Some(stmt) = bb.statements.get(frame.stmt) {
1603+
stmt.source_info.span
1604+
} else {
1605+
bb.terminator().source_info.span
1606+
}
15971607
} else {
1598-
bb.terminator().source_info.span
1608+
self.root_span
15991609
};
16001610
trace!("generate stacktrace: {:#?}, {:?}", frames, explicit_span);
16011611
(frames, span)

0 commit comments

Comments
 (0)