Specialize try_destructure_mir_constant
for its sole user
This commit is contained in:
parent
dfe0683138
commit
4dcf988360
@ -6,7 +6,7 @@
|
|||||||
};
|
};
|
||||||
use rustc_middle::mir;
|
use rustc_middle::mir;
|
||||||
use rustc_middle::mir::interpret::{EvalToValTreeResult, GlobalId};
|
use rustc_middle::mir::interpret::{EvalToValTreeResult, GlobalId};
|
||||||
use rustc_middle::ty::{self, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
use rustc_span::{source_map::DUMMY_SP, symbol::Symbol};
|
use rustc_span::{source_map::DUMMY_SP, symbol::Symbol};
|
||||||
|
|
||||||
mod error;
|
mod error;
|
||||||
@ -89,14 +89,15 @@ pub(crate) fn eval_to_valtree<'tcx>(
|
|||||||
#[instrument(skip(tcx), level = "debug")]
|
#[instrument(skip(tcx), level = "debug")]
|
||||||
pub(crate) fn try_destructure_mir_constant<'tcx>(
|
pub(crate) fn try_destructure_mir_constant<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
val: ConstValue<'tcx>,
|
||||||
val: mir::ConstantKind<'tcx>,
|
ty: Ty<'tcx>,
|
||||||
) -> InterpResult<'tcx, mir::DestructuredConstant<'tcx>> {
|
) -> InterpResult<'tcx, mir::DestructuredConstant<'tcx>> {
|
||||||
|
let param_env = ty::ParamEnv::reveal_all();
|
||||||
let ecx = mk_eval_cx(tcx, DUMMY_SP, param_env, CanAccessStatics::No);
|
let ecx = mk_eval_cx(tcx, DUMMY_SP, param_env, CanAccessStatics::No);
|
||||||
let op = ecx.eval_mir_constant(&val, None, None)?;
|
let op = ecx.const_val_to_op(val, ty, None)?;
|
||||||
|
|
||||||
// We go to `usize` as we cannot allocate anything bigger anyway.
|
// We go to `usize` as we cannot allocate anything bigger anyway.
|
||||||
let (field_count, variant, down) = match val.ty().kind() {
|
let (field_count, variant, down) = match ty.kind() {
|
||||||
ty::Array(_, len) => (len.eval_target_usize(tcx, param_env) as usize, None, op),
|
ty::Array(_, len) => (len.eval_target_usize(tcx, param_env) as usize, None, op),
|
||||||
ty::Adt(def, _) if def.variants().is_empty() => {
|
ty::Adt(def, _) if def.variants().is_empty() => {
|
||||||
throw_ub!(Unreachable)
|
throw_ub!(Unreachable)
|
||||||
|
@ -633,7 +633,7 @@ pub fn eval_mir_constant(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn const_val_to_op(
|
pub(crate) fn const_val_to_op(
|
||||||
&self,
|
&self,
|
||||||
val_val: ConstValue<'tcx>,
|
val_val: ConstValue<'tcx>,
|
||||||
ty: Ty<'tcx>,
|
ty: Ty<'tcx>,
|
||||||
|
@ -52,10 +52,8 @@ pub fn provide(providers: &mut Providers) {
|
|||||||
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)
|
||||||
};
|
};
|
||||||
providers.try_destructure_mir_constant = |tcx, param_env_and_value| {
|
providers.try_destructure_mir_constant =
|
||||||
let (param_env, value) = param_env_and_value.into_parts();
|
|tcx, (cv, ty)| const_eval::try_destructure_mir_constant(tcx, cv, ty).ok();
|
||||||
const_eval::try_destructure_mir_constant(tcx, param_env, value).ok()
|
|
||||||
};
|
|
||||||
providers.valtree_to_const_val = |tcx, (ty, valtree)| {
|
providers.valtree_to_const_val = |tcx, (ty, valtree)| {
|
||||||
const_eval::valtree_to_const_value(tcx, ty::ParamEnv::empty().and(ty), valtree)
|
const_eval::valtree_to_const_value(tcx, ty::ParamEnv::empty().and(ty), valtree)
|
||||||
};
|
};
|
||||||
|
@ -2882,15 +2882,10 @@ fn pretty_print_const_value<'tcx>(
|
|||||||
// introducing ICEs (e.g. via `layout_of`) from missing bounds.
|
// introducing ICEs (e.g. via `layout_of`) from missing bounds.
|
||||||
// E.g. `transmute([0usize; 2]): (u8, *mut T)` needs to know `T: Sized`
|
// E.g. `transmute([0usize; 2]): (u8, *mut T)` needs to know `T: Sized`
|
||||||
// to be able to destructure the tuple into `(0u8, *mut T)`
|
// to be able to destructure the tuple into `(0u8, *mut T)`
|
||||||
//
|
|
||||||
// FIXME(eddyb) for `--emit=mir`/`-Z dump-mir`, we should provide the
|
|
||||||
// correct `ty::ParamEnv` to allow printing *all* constant values.
|
|
||||||
(_, ty::Array(..) | ty::Tuple(..) | ty::Adt(..)) if !ty.has_non_region_param() => {
|
(_, ty::Array(..) | ty::Tuple(..) | ty::Adt(..)) if !ty.has_non_region_param() => {
|
||||||
let ct = tcx.lift(ct).unwrap();
|
let ct = tcx.lift(ct).unwrap();
|
||||||
let ty = tcx.lift(ty).unwrap();
|
let ty = tcx.lift(ty).unwrap();
|
||||||
if let Some(contents) = tcx.try_destructure_mir_constant(
|
if let Some(contents) = tcx.try_destructure_mir_constant((ct, ty)) {
|
||||||
ty::ParamEnv::reveal_all().and(ConstantKind::Val(ct, ty)),
|
|
||||||
) {
|
|
||||||
let fields = contents.fields.to_vec();
|
let fields = contents.fields.to_vec();
|
||||||
match *ty.kind() {
|
match *ty.kind() {
|
||||||
ty::Array(..) => {
|
ty::Array(..) => {
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
use crate::infer::canonical::Canonical;
|
use crate::infer::canonical::Canonical;
|
||||||
use crate::mir;
|
use crate::mir;
|
||||||
|
use crate::mir::interpret::ConstValue;
|
||||||
use crate::traits;
|
use crate::traits;
|
||||||
use crate::ty::fast_reject::SimplifiedType;
|
use crate::ty::fast_reject::SimplifiedType;
|
||||||
use crate::ty::layout::{TyAndLayout, ValidityRequirement};
|
use crate::ty::layout::{TyAndLayout, ValidityRequirement};
|
||||||
@ -333,6 +334,14 @@ fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx> Key for (ConstValue<'tcx>, Ty<'tcx>) {
|
||||||
|
type CacheSelector = DefaultCacheSelector<Self>;
|
||||||
|
|
||||||
|
fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
||||||
|
DUMMY_SP
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> Key for mir::interpret::ConstAlloc<'tcx> {
|
impl<'tcx> Key for mir::interpret::ConstAlloc<'tcx> {
|
||||||
type CacheSelector = DefaultCacheSelector<Self>;
|
type CacheSelector = DefaultCacheSelector<Self>;
|
||||||
|
|
||||||
|
@ -1087,11 +1087,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Tries to destructure an `mir::ConstantKind` ADT or array into its variant index
|
/// Tries to destructure an `mir::ConstantKind` ADT or array into its variant index
|
||||||
/// and its field values.
|
/// and its field values. This should only be used for pretty printing.
|
||||||
query try_destructure_mir_constant(
|
query try_destructure_mir_constant(
|
||||||
key: ty::ParamEnvAnd<'tcx, mir::ConstantKind<'tcx>>
|
key: (ConstValue<'tcx>, Ty<'tcx>)
|
||||||
) -> Option<mir::DestructuredConstant<'tcx>> {
|
) -> Option<mir::DestructuredConstant<'tcx>> {
|
||||||
desc { "destructuring MIR constant"}
|
desc { "destructuring MIR constant"}
|
||||||
|
no_hash
|
||||||
|
eval_always
|
||||||
}
|
}
|
||||||
|
|
||||||
query const_caller_location(key: (rustc_span::Symbol, u32, u32)) -> ConstValue<'tcx> {
|
query const_caller_location(key: (rustc_span::Symbol, u32, u32)) -> ConstValue<'tcx> {
|
||||||
|
Loading…
Reference in New Issue
Block a user