Turn const_caller_location from a query to a hook
This commit is contained in:
parent
045f158d7b
commit
77174d3f29
@ -49,7 +49,7 @@ pub fn provide(providers: &mut Providers) {
|
|||||||
const_eval::provide(providers);
|
const_eval::provide(providers);
|
||||||
providers.eval_to_const_value_raw = const_eval::eval_to_const_value_raw_provider;
|
providers.eval_to_const_value_raw = const_eval::eval_to_const_value_raw_provider;
|
||||||
providers.eval_to_allocation_raw = const_eval::eval_to_allocation_raw_provider;
|
providers.eval_to_allocation_raw = const_eval::eval_to_allocation_raw_provider;
|
||||||
providers.const_caller_location = util::caller_location::const_caller_location_provider;
|
providers.hooks.const_caller_location = util::caller_location::const_caller_location_provider;
|
||||||
providers.eval_to_valtree = |tcx, param_env_and_value| {
|
providers.eval_to_valtree = |tcx, param_env_and_value| {
|
||||||
let (param_env, raw) = param_env_and_value.into_parts();
|
let (param_env, raw) = param_env_and_value.into_parts();
|
||||||
const_eval::eval_to_valtree(tcx, param_env, raw)
|
const_eval::eval_to_valtree(tcx, param_env, raw)
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
use rustc_hir::LangItem;
|
use rustc_hir::LangItem;
|
||||||
use rustc_middle::mir;
|
use rustc_middle::mir;
|
||||||
|
use rustc_middle::query::TyCtxtAt;
|
||||||
|
use rustc_middle::ty;
|
||||||
use rustc_middle::ty::layout::LayoutOf;
|
use rustc_middle::ty::layout::LayoutOf;
|
||||||
use rustc_middle::ty::{self, TyCtxt};
|
use rustc_span::symbol::Symbol;
|
||||||
use rustc_span::{source_map::DUMMY_SP, symbol::Symbol};
|
|
||||||
use rustc_type_ir::Mutability;
|
use rustc_type_ir::Mutability;
|
||||||
|
|
||||||
use crate::const_eval::{mk_eval_cx, CanAccessStatics, CompileTimeEvalContext};
|
use crate::const_eval::{mk_eval_cx, CanAccessStatics, CompileTimeEvalContext};
|
||||||
@ -49,11 +50,13 @@ fn alloc_caller_location<'mir, 'tcx>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn const_caller_location_provider(
|
pub(crate) fn const_caller_location_provider(
|
||||||
tcx: TyCtxt<'_>,
|
tcx: TyCtxtAt<'_>,
|
||||||
(file, line, col): (Symbol, u32, u32),
|
file: Symbol,
|
||||||
|
line: u32,
|
||||||
|
col: u32,
|
||||||
) -> mir::ConstValue<'_> {
|
) -> mir::ConstValue<'_> {
|
||||||
trace!("const_caller_location: {}:{}:{}", file, line, col);
|
trace!("const_caller_location: {}:{}:{}", file, line, col);
|
||||||
let mut ecx = mk_eval_cx(tcx, DUMMY_SP, ty::ParamEnv::reveal_all(), CanAccessStatics::No);
|
let mut ecx = mk_eval_cx(tcx.tcx, tcx.span, ty::ParamEnv::reveal_all(), CanAccessStatics::No);
|
||||||
|
|
||||||
let loc_place = alloc_caller_location(&mut ecx, file, line, col);
|
let loc_place = alloc_caller_location(&mut ecx, file, line, col);
|
||||||
if intern_const_alloc_recursive(&mut ecx, InternKind::Constant, &loc_place).is_err() {
|
if intern_const_alloc_recursive(&mut ecx, InternKind::Constant, &loc_place).is_err() {
|
||||||
|
@ -67,4 +67,7 @@ declare_hooks! {
|
|||||||
/// Tries to destructure an `mir::Const` ADT or array into its variant index
|
/// Tries to destructure an `mir::Const` ADT or array into its variant index
|
||||||
/// and its field values. This should only be used for pretty printing.
|
/// and its field values. This should only be used for pretty printing.
|
||||||
hook try_destructure_mir_constant_for_diagnostics(val: mir::ConstValue<'tcx>, ty: Ty<'tcx>) -> Option<mir::DestructuredConstant<'tcx>>;
|
hook try_destructure_mir_constant_for_diagnostics(val: mir::ConstValue<'tcx>, ty: Ty<'tcx>) -> Option<mir::DestructuredConstant<'tcx>>;
|
||||||
|
|
||||||
|
/// Getting a &core::panic::Location referring to a span.
|
||||||
|
hook const_caller_location(file: rustc_span::Symbol, line: u32, col: u32) -> mir::ConstValue<'tcx>;
|
||||||
}
|
}
|
||||||
|
@ -590,12 +590,12 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||||||
pub fn span_as_caller_location(self, span: Span) -> ConstValue<'tcx> {
|
pub fn span_as_caller_location(self, span: Span) -> ConstValue<'tcx> {
|
||||||
let topmost = span.ctxt().outer_expn().expansion_cause().unwrap_or(span);
|
let topmost = span.ctxt().outer_expn().expansion_cause().unwrap_or(span);
|
||||||
let caller = self.sess.source_map().lookup_char_pos(topmost.lo());
|
let caller = self.sess.source_map().lookup_char_pos(topmost.lo());
|
||||||
self.const_caller_location((
|
self.const_caller_location(
|
||||||
rustc_span::symbol::Symbol::intern(
|
rustc_span::symbol::Symbol::intern(
|
||||||
&caller.file.name.for_codegen(&self.sess).to_string_lossy(),
|
&caller.file.name.for_codegen(&self.sess).to_string_lossy(),
|
||||||
),
|
),
|
||||||
caller.line as u32,
|
caller.line as u32,
|
||||||
caller.col_display as u32 + 1,
|
caller.col_display as u32 + 1,
|
||||||
))
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1101,10 +1101,6 @@ rustc_queries! {
|
|||||||
desc { "destructuring type level constant"}
|
desc { "destructuring type level constant"}
|
||||||
}
|
}
|
||||||
|
|
||||||
query const_caller_location(key: (rustc_span::Symbol, u32, u32)) -> mir::ConstValue<'tcx> {
|
|
||||||
desc { "getting a &core::panic::Location referring to a span" }
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME get rid of this with valtrees
|
// FIXME get rid of this with valtrees
|
||||||
query lit_to_const(
|
query lit_to_const(
|
||||||
key: LitToConstInput<'tcx>
|
key: LitToConstInput<'tcx>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user