Unify the names of const eval queries and their return types
This commit is contained in:
parent
69a6be73e6
commit
888afd50d9
12 changed files with 38 additions and 36 deletions
|
@ -21,7 +21,7 @@ use rustc_middle::infer::canonical::{Canonical, CanonicalVarValues};
|
||||||
use rustc_middle::infer::unify_key::{ConstVarValue, ConstVariableValue};
|
use rustc_middle::infer::unify_key::{ConstVarValue, ConstVariableValue};
|
||||||
use rustc_middle::infer::unify_key::{ConstVariableOrigin, ConstVariableOriginKind, ToType};
|
use rustc_middle::infer::unify_key::{ConstVariableOrigin, ConstVariableOriginKind, ToType};
|
||||||
use rustc_middle::mir;
|
use rustc_middle::mir;
|
||||||
use rustc_middle::mir::interpret::ConstEvalResult;
|
use rustc_middle::mir::interpret::EvalToConstValueResult;
|
||||||
use rustc_middle::traits::select;
|
use rustc_middle::traits::select;
|
||||||
use rustc_middle::ty::error::{ExpectedFound, TypeError, UnconstrainedNumeric};
|
use rustc_middle::ty::error::{ExpectedFound, TypeError, UnconstrainedNumeric};
|
||||||
use rustc_middle::ty::fold::{TypeFoldable, TypeFolder};
|
use rustc_middle::ty::fold::{TypeFoldable, TypeFolder};
|
||||||
|
@ -1542,7 +1542,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||||
substs: SubstsRef<'tcx>,
|
substs: SubstsRef<'tcx>,
|
||||||
promoted: Option<mir::Promoted>,
|
promoted: Option<mir::Promoted>,
|
||||||
span: Option<Span>,
|
span: Option<Span>,
|
||||||
) -> ConstEvalResult<'tcx> {
|
) -> EvalToConstValueResult<'tcx> {
|
||||||
let mut original_values = OriginalQueryValues::default();
|
let mut original_values = OriginalQueryValues::default();
|
||||||
let canonical = self.canonicalize_query(&(param_env, substs), &mut original_values);
|
let canonical = self.canonicalize_query(&(param_env, substs), &mut original_values);
|
||||||
|
|
||||||
|
|
|
@ -27,8 +27,8 @@ CloneTypeFoldableAndLiftImpls! {
|
||||||
ErrorHandled,
|
ErrorHandled,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type ConstEvalRawResult<'tcx> = Result<RawConst<'tcx>, ErrorHandled>;
|
pub type EvalToAllocationRawResult<'tcx> = Result<RawConst<'tcx>, ErrorHandled>;
|
||||||
pub type ConstEvalResult<'tcx> = Result<ConstValue<'tcx>, ErrorHandled>;
|
pub type EvalToConstValueResult<'tcx> = Result<ConstValue<'tcx>, ErrorHandled>;
|
||||||
|
|
||||||
pub fn struct_error<'tcx>(tcx: TyCtxtAt<'tcx>, msg: &str) -> DiagnosticBuilder<'tcx> {
|
pub fn struct_error<'tcx>(tcx: TyCtxtAt<'tcx>, msg: &str) -> DiagnosticBuilder<'tcx> {
|
||||||
struct_span_err!(tcx.sess, tcx.span, E0080, "{}", msg)
|
struct_span_err!(tcx.sess, tcx.span, E0080, "{}", msg)
|
||||||
|
|
|
@ -118,9 +118,9 @@ use crate::ty::subst::GenericArgKind;
|
||||||
use crate::ty::{self, Instance, Ty, TyCtxt};
|
use crate::ty::{self, Instance, Ty, TyCtxt};
|
||||||
|
|
||||||
pub use self::error::{
|
pub use self::error::{
|
||||||
struct_error, CheckInAllocMsg, ConstEvalRawResult, ConstEvalResult, ErrorHandled, InterpError,
|
struct_error, CheckInAllocMsg, ErrorHandled, EvalToAllocationRawResult, EvalToConstValueResult,
|
||||||
InterpErrorInfo, InterpResult, InvalidProgramInfo, MachineStopType, ResourceExhaustionInfo,
|
InterpError, InterpErrorInfo, InterpResult, InvalidProgramInfo, MachineStopType,
|
||||||
UndefinedBehaviorInfo, UninitBytesAccess, UnsupportedOpInfo,
|
ResourceExhaustionInfo, UndefinedBehaviorInfo, UninitBytesAccess, UnsupportedOpInfo,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub use self::value::{get_slice_bytes, ConstValue, RawConst, Scalar, ScalarMaybeUninit};
|
pub use self::value::{get_slice_bytes, ConstValue, RawConst, Scalar, ScalarMaybeUninit};
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use super::{ConstEvalResult, ErrorHandled, GlobalId};
|
use super::{ErrorHandled, EvalToConstValueResult, GlobalId};
|
||||||
|
|
||||||
use crate::mir;
|
use crate::mir;
|
||||||
use crate::ty::subst::{InternalSubsts, SubstsRef};
|
use crate::ty::subst::{InternalSubsts, SubstsRef};
|
||||||
|
@ -10,7 +10,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
/// Evaluates a constant without providing any substitutions. This is useful to evaluate consts
|
/// Evaluates a constant without providing any substitutions. This is useful to evaluate consts
|
||||||
/// that can't take any generic arguments like statics, const items or enum discriminants. If a
|
/// that can't take any generic arguments like statics, const items or enum discriminants. If a
|
||||||
/// generic parameter is used within the constant `ErrorHandled::ToGeneric` will be returned.
|
/// generic parameter is used within the constant `ErrorHandled::ToGeneric` will be returned.
|
||||||
pub fn const_eval_poly(self, def_id: DefId) -> ConstEvalResult<'tcx> {
|
pub fn const_eval_poly(self, def_id: DefId) -> EvalToConstValueResult<'tcx> {
|
||||||
// In some situations def_id will have substitutions within scope, but they aren't allowed
|
// In some situations def_id will have substitutions within scope, but they aren't allowed
|
||||||
// to be used. So we can't use `Instance::mono`, instead we feed unresolved substitutions
|
// to be used. So we can't use `Instance::mono`, instead we feed unresolved substitutions
|
||||||
// into `const_eval` which will return `ErrorHandled::ToGeneric` if any of them are
|
// into `const_eval` which will return `ErrorHandled::ToGeneric` if any of them are
|
||||||
|
@ -38,7 +38,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
substs: SubstsRef<'tcx>,
|
substs: SubstsRef<'tcx>,
|
||||||
promoted: Option<mir::Promoted>,
|
promoted: Option<mir::Promoted>,
|
||||||
span: Option<Span>,
|
span: Option<Span>,
|
||||||
) -> ConstEvalResult<'tcx> {
|
) -> EvalToConstValueResult<'tcx> {
|
||||||
match ty::Instance::resolve_opt_const_arg(self, param_env, def, substs) {
|
match ty::Instance::resolve_opt_const_arg(self, param_env, def, substs) {
|
||||||
Ok(Some(instance)) => {
|
Ok(Some(instance)) => {
|
||||||
let cid = GlobalId { instance, promoted };
|
let cid = GlobalId { instance, promoted };
|
||||||
|
@ -54,7 +54,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
instance: ty::Instance<'tcx>,
|
instance: ty::Instance<'tcx>,
|
||||||
span: Option<Span>,
|
span: Option<Span>,
|
||||||
) -> ConstEvalResult<'tcx> {
|
) -> EvalToConstValueResult<'tcx> {
|
||||||
self.const_eval_global_id(param_env, GlobalId { instance, promoted: None }, span)
|
self.const_eval_global_id(param_env, GlobalId { instance, promoted: None }, span)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,14 +64,14 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
cid: GlobalId<'tcx>,
|
cid: GlobalId<'tcx>,
|
||||||
span: Option<Span>,
|
span: Option<Span>,
|
||||||
) -> ConstEvalResult<'tcx> {
|
) -> EvalToConstValueResult<'tcx> {
|
||||||
// Const-eval shouldn't depend on lifetimes at all, so we can erase them, which should
|
// Const-eval shouldn't depend on lifetimes at all, so we can erase them, which should
|
||||||
// improve caching of queries.
|
// improve caching of queries.
|
||||||
let inputs = self.erase_regions(¶m_env.and(cid));
|
let inputs = self.erase_regions(¶m_env.and(cid));
|
||||||
if let Some(span) = span {
|
if let Some(span) = span {
|
||||||
self.at(span).const_eval_for_ty(inputs)
|
self.at(span).eval_to_const_value(inputs)
|
||||||
} else {
|
} else {
|
||||||
self.const_eval_for_ty(inputs)
|
self.eval_to_const_value(inputs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
) -> Result<&'tcx mir::Allocation, ErrorHandled> {
|
) -> Result<&'tcx mir::Allocation, ErrorHandled> {
|
||||||
trace!("eval_to_allocation: Need to compute {:?}", gid);
|
trace!("eval_to_allocation: Need to compute {:?}", gid);
|
||||||
let raw_const = self.const_eval(param_env.and(gid))?;
|
let raw_const = self.eval_to_allocation_raw(param_env.and(gid))?;
|
||||||
Ok(self.global_alloc(raw_const.alloc_id).unwrap_memory())
|
Ok(self.global_alloc(raw_const.alloc_id).unwrap_memory())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ use crate::ty::{ParamEnv, Ty, TyCtxt};
|
||||||
|
|
||||||
use super::{sign_extend, truncate, AllocId, Allocation, InterpResult, Pointer, PointerArithmetic};
|
use super::{sign_extend, truncate, AllocId, Allocation, InterpResult, Pointer, PointerArithmetic};
|
||||||
|
|
||||||
/// Represents the result of a raw const operation, pre-validation.
|
/// Represents the result of const evaluation via the `eval_to_allocation` query.
|
||||||
#[derive(Clone, HashStable)]
|
#[derive(Clone, HashStable)]
|
||||||
pub struct RawConst<'tcx> {
|
pub struct RawConst<'tcx> {
|
||||||
// the value lives here, at offset 0, and that allocation definitely is a `AllocKind::Memory`
|
// the value lives here, at offset 0, and that allocation definitely is a `AllocKind::Memory`
|
||||||
|
|
|
@ -708,8 +708,10 @@ rustc_queries! {
|
||||||
|
|
||||||
Other {
|
Other {
|
||||||
/// Evaluates a constant and returns the computed allocation.
|
/// Evaluates a constant and returns the computed allocation.
|
||||||
query const_eval(key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>)
|
///
|
||||||
-> ConstEvalRawResult<'tcx> {
|
/// **Do not use this** directly, use the `tcx.eval_static_initializer` wrapper.
|
||||||
|
query eval_to_allocation_raw(key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>)
|
||||||
|
-> EvalToAllocationRawResult<'tcx> {
|
||||||
desc { |tcx|
|
desc { |tcx|
|
||||||
"const-evaluating `{}`",
|
"const-evaluating `{}`",
|
||||||
key.value.display(tcx)
|
key.value.display(tcx)
|
||||||
|
@ -722,8 +724,8 @@ rustc_queries! {
|
||||||
///
|
///
|
||||||
/// **Do not use this** directly, use one of the following wrappers: `tcx.const_eval_poly`,
|
/// **Do not use this** directly, use one of the following wrappers: `tcx.const_eval_poly`,
|
||||||
/// `tcx.const_eval_resolve`, `tcx.const_eval_instance`, or `tcx.const_eval_global_id`.
|
/// `tcx.const_eval_resolve`, `tcx.const_eval_instance`, or `tcx.const_eval_global_id`.
|
||||||
query const_eval_for_ty(key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>)
|
query eval_to_const_value(key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>)
|
||||||
-> ConstEvalResult<'tcx> {
|
-> EvalToConstValueResult<'tcx> {
|
||||||
desc { |tcx|
|
desc { |tcx|
|
||||||
"const-evaluating + checking `{}`",
|
"const-evaluating + checking `{}`",
|
||||||
key.value.display(tcx)
|
key.value.display(tcx)
|
||||||
|
|
|
@ -14,7 +14,7 @@ use crate::middle::resolve_lifetime::{ObjectLifetimeDefault, Region, ResolveLife
|
||||||
use crate::middle::stability::{self, DeprecationEntry};
|
use crate::middle::stability::{self, DeprecationEntry};
|
||||||
use crate::mir;
|
use crate::mir;
|
||||||
use crate::mir::interpret::GlobalId;
|
use crate::mir::interpret::GlobalId;
|
||||||
use crate::mir::interpret::{ConstEvalRawResult, ConstEvalResult, ConstValue};
|
use crate::mir::interpret::{ConstValue, EvalToAllocationRawResult, EvalToConstValueResult};
|
||||||
use crate::mir::interpret::{LitToConstError, LitToConstInput};
|
use crate::mir::interpret::{LitToConstError, LitToConstInput};
|
||||||
use crate::mir::mono::CodegenUnit;
|
use crate::mir::mono::CodegenUnit;
|
||||||
use crate::traits::query::{
|
use crate::traits::query::{
|
||||||
|
|
|
@ -200,21 +200,21 @@ fn turn_into_const<'tcx>(
|
||||||
);
|
);
|
||||||
assert!(
|
assert!(
|
||||||
!is_static || cid.promoted.is_some(),
|
!is_static || cid.promoted.is_some(),
|
||||||
"the `const_eval_for_ty` query should not be used for statics, use `const_eval` instead"
|
"the `eval_to_const_value` query should not be used for statics, use `eval_to_allocation` instead"
|
||||||
);
|
);
|
||||||
// Turn this into a proper constant.
|
// Turn this into a proper constant.
|
||||||
op_to_const(&ecx, mplace.into())
|
op_to_const(&ecx, mplace.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn const_eval_for_ty_provider<'tcx>(
|
pub fn eval_to_const_value_provider<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>,
|
key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>,
|
||||||
) -> ::rustc_middle::mir::interpret::ConstEvalResult<'tcx> {
|
) -> ::rustc_middle::mir::interpret::EvalToConstValueResult<'tcx> {
|
||||||
// see comment in const_eval_provider for what we're doing here
|
// see comment in const_eval_raw_provider for what we're doing here
|
||||||
if key.param_env.reveal() == Reveal::All {
|
if key.param_env.reveal() == Reveal::All {
|
||||||
let mut key = key;
|
let mut key = key;
|
||||||
key.param_env = key.param_env.with_user_facing();
|
key.param_env = key.param_env.with_user_facing();
|
||||||
match tcx.const_eval_for_ty(key) {
|
match tcx.eval_to_const_value(key) {
|
||||||
// try again with reveal all as requested
|
// try again with reveal all as requested
|
||||||
Err(ErrorHandled::TooGeneric) => {}
|
Err(ErrorHandled::TooGeneric) => {}
|
||||||
// deduplicate calls
|
// deduplicate calls
|
||||||
|
@ -237,13 +237,13 @@ pub fn const_eval_for_ty_provider<'tcx>(
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
tcx.const_eval(key).map(|val| turn_into_const(tcx, val, key))
|
tcx.eval_to_allocation_raw(key).map(|val| turn_into_const(tcx, val, key))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn const_eval_provider<'tcx>(
|
pub fn eval_to_allocation_raw_provider<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>,
|
key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>,
|
||||||
) -> ::rustc_middle::mir::interpret::ConstEvalRawResult<'tcx> {
|
) -> ::rustc_middle::mir::interpret::EvalToAllocationRawResult<'tcx> {
|
||||||
// Because the constant is computed twice (once per value of `Reveal`), we are at risk of
|
// Because the constant is computed twice (once per value of `Reveal`), we are at risk of
|
||||||
// reporting the same error twice here. To resolve this, we check whether we can evaluate the
|
// reporting the same error twice here. To resolve this, we check whether we can evaluate the
|
||||||
// constant in the more restrictive `Reveal::UserFacing`, which most likely already was
|
// constant in the more restrictive `Reveal::UserFacing`, which most likely already was
|
||||||
|
@ -255,7 +255,7 @@ pub fn const_eval_provider<'tcx>(
|
||||||
if key.param_env.reveal() == Reveal::All {
|
if key.param_env.reveal() == Reveal::All {
|
||||||
let mut key = key;
|
let mut key = key;
|
||||||
key.param_env = key.param_env.with_user_facing();
|
key.param_env = key.param_env.with_user_facing();
|
||||||
match tcx.const_eval(key) {
|
match tcx.eval_to_allocation_raw(key) {
|
||||||
// try again with reveal all as requested
|
// try again with reveal all as requested
|
||||||
Err(ErrorHandled::TooGeneric) => {}
|
Err(ErrorHandled::TooGeneric) => {}
|
||||||
// deduplicate calls
|
// deduplicate calls
|
||||||
|
|
|
@ -51,7 +51,7 @@ impl<'mir, 'tcx> InterpCx<'mir, 'tcx, CompileTimeInterpreter<'mir, 'tcx>> {
|
||||||
|
|
||||||
let gid = GlobalId { instance, promoted: None };
|
let gid = GlobalId { instance, promoted: None };
|
||||||
|
|
||||||
let place = self.const_eval(gid)?;
|
let place = self.eval_to_allocation(gid)?;
|
||||||
|
|
||||||
self.copy_op(place.into(), dest)?;
|
self.copy_op(place.into(), dest)?;
|
||||||
|
|
||||||
|
|
|
@ -875,7 +875,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn const_eval(
|
pub fn eval_to_allocation(
|
||||||
&self,
|
&self,
|
||||||
gid: GlobalId<'tcx>,
|
gid: GlobalId<'tcx>,
|
||||||
) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> {
|
) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> {
|
||||||
|
@ -889,7 +889,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
} else {
|
} else {
|
||||||
self.param_env
|
self.param_env
|
||||||
};
|
};
|
||||||
let val = self.tcx.const_eval(param_env.and(gid))?;
|
let val = self.tcx.eval_to_allocation_raw(param_env.and(gid))?;
|
||||||
self.raw_const_to_mplace(val)
|
self.raw_const_to_mplace(val)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -553,7 +553,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
ty::ConstKind::Error(_) => throw_inval!(TypeckError(ErrorReported)),
|
ty::ConstKind::Error(_) => throw_inval!(TypeckError(ErrorReported)),
|
||||||
ty::ConstKind::Unevaluated(def, substs, promoted) => {
|
ty::ConstKind::Unevaluated(def, substs, promoted) => {
|
||||||
let instance = self.resolve(def.did, substs)?;
|
let instance = self.resolve(def.did, substs)?;
|
||||||
return Ok(self.const_eval(GlobalId { instance, promoted })?.into());
|
return Ok(self.eval_to_allocation(GlobalId { instance, promoted })?.into());
|
||||||
}
|
}
|
||||||
ty::ConstKind::Infer(..)
|
ty::ConstKind::Infer(..)
|
||||||
| ty::ConstKind::Bound(..)
|
| ty::ConstKind::Bound(..)
|
||||||
|
|
|
@ -52,8 +52,8 @@ pub fn provide(providers: &mut Providers) {
|
||||||
transform::provide(providers);
|
transform::provide(providers);
|
||||||
monomorphize::partitioning::provide(providers);
|
monomorphize::partitioning::provide(providers);
|
||||||
monomorphize::polymorphize::provide(providers);
|
monomorphize::polymorphize::provide(providers);
|
||||||
providers.const_eval_for_ty = const_eval::const_eval_for_ty_provider;
|
providers.eval_to_const_value = const_eval::eval_to_const_value_provider;
|
||||||
providers.const_eval = const_eval::const_eval_provider;
|
providers.eval_to_allocation_raw = const_eval::eval_to_allocation_raw_provider;
|
||||||
providers.const_caller_location = const_eval::const_caller_location;
|
providers.const_caller_location = const_eval::const_caller_location;
|
||||||
providers.destructure_const = |tcx, param_env_and_value| {
|
providers.destructure_const = |tcx, param_env_and_value| {
|
||||||
let (param_env, value) = param_env_and_value.into_parts();
|
let (param_env, value) = param_env_and_value.into_parts();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue