Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/consteval.rs')
-rw-r--r--crates/hir-ty/src/consteval.rs42
1 files changed, 24 insertions, 18 deletions
diff --git a/crates/hir-ty/src/consteval.rs b/crates/hir-ty/src/consteval.rs
index f30ec839a0..0f2cc17f56 100644
--- a/crates/hir-ty/src/consteval.rs
+++ b/crates/hir-ty/src/consteval.rs
@@ -15,8 +15,14 @@ use triomphe::Arc;
use crate::{
Const, ConstData, ConstScalar, ConstValue, GenericArg, Interner, MemoryMap, Substitution,
- TraitEnvironment, Ty, TyBuilder, db::HirDatabase, display::DisplayTarget, generics::Generics,
- infer::InferenceContext, lower::ParamLoweringMode, to_placeholder_idx,
+ TraitEnvironment, Ty, TyBuilder,
+ db::HirDatabase,
+ display::DisplayTarget,
+ generics::Generics,
+ infer::InferenceContext,
+ lower::ParamLoweringMode,
+ next_solver::{DbInterner, mapping::ChalkToNextSolver},
+ to_placeholder_idx,
};
use super::mir::{MirEvalError, MirLowerError, interpret_mir, lower_to_mir, pad16};
@@ -101,25 +107,24 @@ pub(crate) fn path_to_const<'g>(
match resolver.resolve_path_in_value_ns_fully(db, path, HygieneId::ROOT) {
Some(ValueNs::GenericParam(p)) => {
let ty = db.const_param_ty(p);
+ let args = args();
let value = match mode {
ParamLoweringMode::Placeholder => {
- ConstValue::Placeholder(to_placeholder_idx(db, p.into()))
+ let idx = args.type_or_const_param_idx(p.into()).unwrap();
+ ConstValue::Placeholder(to_placeholder_idx(db, p.into(), idx as u32))
}
- ParamLoweringMode::Variable => {
- let args = args();
- match args.type_or_const_param_idx(p.into()) {
- Some(it) => ConstValue::BoundVar(BoundVar::new(debruijn, it)),
- None => {
- never!(
- "Generic list doesn't contain this param: {:?}, {:?}, {:?}",
- args,
- path,
- p
- );
- return None;
- }
+ ParamLoweringMode::Variable => match args.type_or_const_param_idx(p.into()) {
+ Some(it) => ConstValue::BoundVar(BoundVar::new(debruijn, it)),
+ None => {
+ never!(
+ "Generic list doesn't contain this param: {:?}, {:?}, {:?}",
+ args,
+ path,
+ p
+ );
+ return None;
}
- }
+ },
};
Some(ConstData { ty, value }.intern(Interner))
}
@@ -157,7 +162,8 @@ pub fn intern_const_ref(
ty: Ty,
krate: Crate,
) -> Const {
- let layout = || db.layout_of_ty(ty.clone(), TraitEnvironment::empty(krate));
+ let interner = DbInterner::new_with(db, Some(krate), None);
+ let layout = || db.layout_of_ty(ty.to_nextsolver(interner), TraitEnvironment::empty(krate));
let bytes = match value {
LiteralConstRef::Int(i) => {
// FIXME: We should handle failure of layout better.