diff --git a/compiler/rustc_const_eval/src/const_eval/error.rs b/compiler/rustc_const_eval/src/const_eval/error.rs index 3eeb0138b37f7..eb81f43c3fe8c 100644 --- a/compiler/rustc_const_eval/src/const_eval/error.rs +++ b/compiler/rustc_const_eval/src/const_eval/error.rs @@ -82,12 +82,12 @@ impl<'tcx> ConstEvalErr<'tcx> { 'tcx: 'mir, { error.print_backtrace(); - let stacktrace = ecx.generate_stacktrace(); - ConstEvalErr { - error: error.into_kind(), - stacktrace, - span: span.unwrap_or_else(|| ecx.cur_span()), - } + let mut stacktrace = ecx.generate_stacktrace(); + // Filter out `requires_caller_location` frames. + stacktrace.retain(|frame| !frame.instance.def.requires_caller_location(*ecx.tcx)); + // If `span` is missing, use topmost remaining frame, or else the "root" span from `ecx.tcx`. + let span = span.or_else(|| stacktrace.first().map(|f| f.span)).unwrap_or(ecx.tcx.span); + ConstEvalErr { error: error.into_kind(), stacktrace, span } } pub fn struct_error( diff --git a/compiler/rustc_const_eval/src/const_eval/eval_queries.rs b/compiler/rustc_const_eval/src/const_eval/eval_queries.rs index b7e5e7aea49ce..09a2977af0403 100644 --- a/compiler/rustc_const_eval/src/const_eval/eval_queries.rs +++ b/compiler/rustc_const_eval/src/const_eval/eval_queries.rs @@ -337,7 +337,7 @@ pub fn eval_to_allocation_raw_provider<'tcx>( } }; - Err(err.report_as_error(ecx.tcx.at(ecx.cur_span()), &msg)) + Err(err.report_as_error(ecx.tcx.at(err.span), &msg)) } else { let hir_id = tcx.hir().local_def_id_to_hir_id(def.as_local().unwrap().did); Err(err.report_as_lint( diff --git a/compiler/rustc_const_eval/src/interpret/eval_context.rs b/compiler/rustc_const_eval/src/interpret/eval_context.rs index 1c1bbd370bd49..66c736245017c 100644 --- a/compiler/rustc_const_eval/src/interpret/eval_context.rs +++ b/compiler/rustc_const_eval/src/interpret/eval_context.rs @@ -428,11 +428,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { #[inline(always)] pub fn cur_span(&self) -> Span { - self.stack() - .iter() - .rev() - .find(|frame| !frame.instance.def.requires_caller_location(*self.tcx)) - .map_or(self.tcx.span, |f| f.current_span()) + // This deliberately does *not* honor `requires_caller_location` since it is used for much + // more than just panics. + self.stack().last().map_or(self.tcx.span, |f| f.current_span()) } #[inline(always)] @@ -939,12 +937,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { #[must_use] pub fn generate_stacktrace(&self) -> Vec> { let mut frames = Vec::new(); - for frame in self - .stack() - .iter() - .rev() - .skip_while(|frame| frame.instance.def.requires_caller_location(*self.tcx)) - { + // This deliberately does *not* honor `requires_caller_location` since it is used for much + // more than just panics. + for frame in self.stack().iter().rev() { let lint_root = frame.current_source_info().and_then(|source_info| { match &frame.body.source_scopes[source_info.scope].local_data { mir::ClearCrossCrate::Set(data) => Some(data.lint_root),