Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/mir/eval.rs')
-rw-r--r--crates/hir-ty/src/mir/eval.rs55
1 files changed, 34 insertions, 21 deletions
diff --git a/crates/hir-ty/src/mir/eval.rs b/crates/hir-ty/src/mir/eval.rs
index 8701ad5be6..9e2861fa2b 100644
--- a/crates/hir-ty/src/mir/eval.rs
+++ b/crates/hir-ty/src/mir/eval.rs
@@ -5,9 +5,9 @@ use std::{borrow::Cow, cell::RefCell, fmt::Write, iter, mem, ops::Range};
use base_db::{Crate, target::TargetLoadError};
use either::Either;
use hir_def::{
- AdtId, DefWithBodyId, EnumVariantId, ExpressionStoreOwnerId, FunctionId, GeneralConstId,
- HasModule, ItemContainerId, Lookup, StaticId, VariantId,
- expr_store::{Body, HygieneId},
+ AdtId, DefWithBodyId, EnumVariantId, FunctionId, HasModule, ItemContainerId, Lookup, StaticId,
+ VariantId,
+ expr_store::{Body, ExpressionStore, HygieneId},
item_tree::FieldsShape,
lang_item::LangItems,
layout::{TagEncoding, Variants},
@@ -37,9 +37,9 @@ use syntax::{SyntaxNodePtr, TextRange};
use triomphe::Arc;
use crate::{
- CallableDefId, ComplexMemoryMap, InferenceResult, MemoryMap, ParamEnvAndCrate,
+ CallableDefId, ComplexMemoryMap, InferBodyId, InferenceResult, MemoryMap, ParamEnvAndCrate,
consteval::{self, ConstEvalError, try_const_usize},
- db::{HirDatabase, InternedClosureId},
+ db::{GeneralConstId, HirDatabase, InternedClosureId},
display::{ClosureStyle, DisplayTarget, HirDisplay},
infer::PointerCast,
layout::{Layout, LayoutError, RustcEnumVariantIdx},
@@ -159,7 +159,7 @@ struct StackFrame<'a> {
locals: Locals<'a>,
destination: Option<BasicBlockId>,
prev_stack_ptr: usize,
- span: (MirSpan, DefWithBodyId),
+ span: (MirSpan, InferBodyId),
}
#[derive(Clone)]
@@ -193,7 +193,7 @@ pub struct Evaluator<'a, 'db> {
/// Constantly dropping and creating `Locals` is very costly. We store
/// old locals that we normally want to drop here, to reuse their allocations
/// later.
- unused_locals_store: RefCell<FxHashMap<DefWithBodyId, Vec<Locals<'a>>>>,
+ unused_locals_store: RefCell<FxHashMap<InferBodyId, Vec<Locals<'a>>>>,
cached_ptr_size: usize,
cached_fn_trait_func: Option<FunctionId>,
cached_fn_mut_trait_func: Option<FunctionId>,
@@ -371,7 +371,7 @@ pub enum MirEvalError {
InvalidConst,
InFunction(
Box<MirEvalError>,
- Vec<(Either<FunctionId, InternedClosureId>, MirSpan, DefWithBodyId)>,
+ Vec<(Either<FunctionId, InternedClosureId>, MirSpan, InferBodyId)>,
),
ExecutionLimitExceeded,
StackOverflow,
@@ -410,7 +410,16 @@ impl MirEvalError {
writeln!(f, "In {closure:?}")?;
}
}
- let source_map = &Body::with_source_map(db, *def).1;
+ let (source_map, self_param_syntax) = match *def {
+ InferBodyId::DefWithBodyId(def) => {
+ let body = &Body::with_source_map(db, def).1;
+ (&**body, body.self_param_syntax())
+ }
+ InferBodyId::AnonConstId(def) => {
+ let store = ExpressionStore::with_source_map(db, def.loc(db).owner).1;
+ (store, None)
+ }
+ };
let span: InFile<SyntaxNodePtr> = match span {
MirSpan::ExprId(e) => match source_map.expr_syntax(*e) {
Ok(s) => s.map(|it| it.into()),
@@ -430,7 +439,7 @@ impl MirEvalError {
None => continue,
}
}
- MirSpan::SelfParam => match source_map.self_param_syntax() {
+ MirSpan::SelfParam => match self_param_syntax {
Some(s) => s.map(|it| it.syntax_node_ptr()),
None => continue,
},
@@ -650,7 +659,7 @@ const EXECUTION_LIMIT: usize = 10_000_000;
impl<'a, 'db: 'a> Evaluator<'a, 'db> {
pub fn new(
db: &'db dyn HirDatabase,
- owner: DefWithBodyId,
+ owner: InferBodyId,
assert_placeholder_ty_is_unused: bool,
trait_env: Option<ParamEnvAndCrate<'db>>,
) -> Result<'db, Evaluator<'a, 'db>> {
@@ -675,7 +684,7 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
db,
random_state: oorandom::Rand64::new(0),
param_env: trait_env.unwrap_or_else(|| ParamEnvAndCrate {
- param_env: db.trait_environment(ExpressionStoreOwnerId::from(owner)),
+ param_env: db.trait_environment(owner.expression_store_owner(db)),
krate: crate_id,
}),
crate_id,
@@ -1044,7 +1053,7 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
let my_code_stack = mem::replace(&mut self.code_stack, prev_code_stack);
let mut error_stack = vec![];
for frame in my_code_stack.into_iter().rev() {
- if let DefWithBodyId::FunctionId(f) = frame.locals.body.owner {
+ if let Some(f) = frame.locals.body.owner.as_function() {
error_stack.push((Either::Left(f), frame.span.0, frame.span.1));
}
}
@@ -1806,7 +1815,7 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
locals: &Locals<'a>,
) -> Result<'db, (usize, Arc<Layout>, Option<(usize, usize, i128)>)> {
let adt = it.adt_id(self.db);
- if let DefWithBodyId::VariantId(f) = locals.body.owner
+ if let Some(f) = locals.body.owner.as_variant()
&& let VariantId::EnumVariantId(it) = it
&& let AdtId::EnumId(e) = adt
&& f.lookup(self.db).parent == e
@@ -2058,9 +2067,9 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
ConstKind::Unevaluated(UnevaluatedConst { def: const_id, args: subst }) => {
let mut id = const_id.0;
let mut subst = subst;
- if let hir_def::GeneralConstId::ConstId(c) = id {
+ if let GeneralConstId::ConstId(c) = id {
let (c, s) = lookup_impl_const(&self.infcx, self.param_env.param_env, c, subst);
- id = hir_def::GeneralConstId::ConstId(c);
+ id = GeneralConstId::ConstId(c);
subst = s;
}
let allocation = match id {
@@ -2076,9 +2085,13 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
MirEvalError::ConstEvalError(name, Box::new(e))
})?
}
- GeneralConstId::AnonConstId(_) => {
- not_supported!("anonymous const evaluation")
- }
+ GeneralConstId::AnonConstId(anon_const_id) => self
+ .db
+ .anon_const_eval(anon_const_id, subst, Some(self.param_env))
+ .map_err(|e| {
+ let name = id.name(self.db);
+ MirEvalError::ConstEvalError(name, Box::new(e))
+ })?,
};
self.allocate_allocation_in_heap(locals, allocation)
}
@@ -2237,7 +2250,7 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
.is_sized()
.then(|| (layout.size.bytes_usize(), layout.align.bytes() as usize)));
}
- if let DefWithBodyId::VariantId(f) = locals.body.owner
+ if let Some(f) = locals.body.owner.as_variant()
&& let Some((AdtId::EnumId(e), _)) = ty.as_adt()
&& f.lookup(self.db).parent == e
{
@@ -3127,7 +3140,7 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
pub fn render_const_using_debug_impl<'db>(
db: &'db dyn HirDatabase,
- owner: DefWithBodyId,
+ owner: InferBodyId,
c: Allocation<'db>,
ty: Ty<'db>,
) -> Result<'db, String> {