Skip to content

Commit 7804a2d

Browse files
authored
Merge pull request #20728 from jackh726/next-trait-solver-next2
Use ParamEnv in TraitEnvironment
2 parents d05355d + 34f773f commit 7804a2d

38 files changed

+382
-303
lines changed

crates/hir-ty/src/autoderef.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ const AUTODEREF_RECURSION_LIMIT: usize = 20;
3232
/// - the yielded types don't contain inference variables (but may contain `TyKind::Error`).
3333
/// - a type won't be yielded more than once; in other words, the returned iterator will stop if it
3434
/// detects a cycle in the deref chain.
35-
pub fn autoderef(
36-
db: &dyn HirDatabase,
37-
env: Arc<TraitEnvironment>,
35+
pub fn autoderef<'db>(
36+
db: &'db dyn HirDatabase,
37+
env: Arc<TraitEnvironment<'db>>,
3838
ty: crate::Canonical<crate::Ty>,
39-
) -> impl Iterator<Item = crate::Ty> {
39+
) -> impl Iterator<Item = crate::Ty> + use<> {
4040
let mut table = InferenceTable::new(db, env);
4141
let interner = table.interner;
4242
let ty = table.instantiate_canonical(ty);
@@ -298,7 +298,7 @@ fn structurally_normalize_ty<'db>(
298298
) -> Option<(Ty<'db>, PredicateObligations<'db>)> {
299299
let mut ocx = ObligationCtxt::new(&table.infer_ctxt);
300300
let Ok(normalized_ty) =
301-
ocx.structurally_normalize_ty(&ObligationCause::misc(), table.param_env, ty)
301+
ocx.structurally_normalize_ty(&ObligationCause::misc(), table.trait_env.env, ty)
302302
else {
303303
// We shouldn't have errors here in the old solver, except for
304304
// evaluate/fulfill mismatches, but that's not a reason for an ICE.

crates/hir-ty/src/chalk_ext.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,13 @@ use crate::{
1515
AdtId, AliasEq, AliasTy, Binders, CallableDefId, CallableSig, Canonical, CanonicalVarKinds,
1616
ClosureId, DynTy, FnPointer, ImplTraitId, InEnvironment, Interner, Lifetime, ProjectionTy,
1717
QuantifiedWhereClause, Substitution, ToChalk, TraitRef, Ty, TyBuilder, TyKind, TypeFlags,
18-
WhereClause, db::HirDatabase, from_assoc_type_id, from_chalk_trait_id, from_foreign_def_id,
19-
from_placeholder_idx, generics::generics, to_chalk_trait_id, utils::ClosureSubst,
18+
WhereClause,
19+
db::HirDatabase,
20+
from_assoc_type_id, from_chalk_trait_id, from_foreign_def_id, from_placeholder_idx,
21+
generics::generics,
22+
next_solver::{DbInterner, mapping::NextSolverToChalk},
23+
to_chalk_trait_id,
24+
utils::ClosureSubst,
2025
};
2126

2227
pub trait TyExt {
@@ -372,7 +377,10 @@ impl TyExt for Ty {
372377
let trait_ref = TyBuilder::trait_ref(db, copy_trait).push(self).build();
373378
let env = db.trait_environment_for_body(owner);
374379
let goal = Canonical {
375-
value: InEnvironment::new(&env.env, trait_ref.cast(Interner)),
380+
value: InEnvironment::new(
381+
&env.env.to_chalk(DbInterner::new_with(db, Some(env.krate), env.block)),
382+
trait_ref.cast(Interner),
383+
),
376384
binders: CanonicalVarKinds::empty(Interner),
377385
};
378386
!db.trait_solve(crate_id, None, goal).no_solution()

crates/hir-ty/src/consteval.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ pub(crate) fn const_eval_cycle_result(
229229
_: &dyn HirDatabase,
230230
_: GeneralConstId,
231231
_: Substitution,
232-
_: Option<Arc<TraitEnvironment>>,
232+
_: Option<Arc<TraitEnvironment<'_>>>,
233233
) -> Result<Const, ConstEvalError> {
234234
Err(ConstEvalError::MirLowerError(MirLowerError::Loop))
235235
}
@@ -252,7 +252,7 @@ pub(crate) fn const_eval_query(
252252
db: &dyn HirDatabase,
253253
def: GeneralConstId,
254254
subst: Substitution,
255-
trait_env: Option<Arc<TraitEnvironment>>,
255+
trait_env: Option<Arc<TraitEnvironment<'_>>>,
256256
) -> Result<Const, ConstEvalError> {
257257
let body = match def {
258258
GeneralConstId::ConstId(c) => {

crates/hir-ty/src/db.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
4949
&self,
5050
def: DefWithBodyId,
5151
subst: Substitution,
52-
env: Arc<TraitEnvironment>,
52+
env: Arc<TraitEnvironment<'_>>,
5353
) -> Result<Arc<MirBody>, MirLowerError>;
5454

5555
#[salsa::invoke(crate::mir::monomorphized_mir_body_for_closure_query)]
5656
fn monomorphized_mir_body_for_closure(
5757
&self,
5858
def: InternedClosureId,
5959
subst: Substitution,
60-
env: Arc<TraitEnvironment>,
60+
env: Arc<TraitEnvironment<'_>>,
6161
) -> Result<Arc<MirBody>, MirLowerError>;
6262

6363
#[salsa::invoke(crate::mir::borrowck_query)]
@@ -70,7 +70,7 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
7070
&self,
7171
def: GeneralConstId,
7272
subst: Substitution,
73-
trait_env: Option<Arc<TraitEnvironment>>,
73+
trait_env: Option<Arc<TraitEnvironment<'_>>>,
7474
) -> Result<Const, ConstEvalError>;
7575

7676
#[salsa::invoke(crate::consteval::const_eval_static_query)]
@@ -84,7 +84,7 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
8484
#[salsa::invoke(crate::method_resolution::lookup_impl_method_query)]
8585
fn lookup_impl_method(
8686
&self,
87-
env: Arc<TraitEnvironment>,
87+
env: Arc<TraitEnvironment<'_>>,
8888
func: FunctionId,
8989
fn_subst: Substitution,
9090
) -> (FunctionId, Substitution);
@@ -97,15 +97,15 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
9797
&'db self,
9898
def: AdtId,
9999
args: crate::next_solver::GenericArgs<'db>,
100-
trait_env: Arc<TraitEnvironment>,
100+
trait_env: Arc<TraitEnvironment<'db>>,
101101
) -> Result<Arc<Layout>, LayoutError>;
102102

103103
#[salsa::invoke(crate::layout::layout_of_ty_query)]
104104
#[salsa::cycle(cycle_result = crate::layout::layout_of_ty_cycle_result)]
105105
fn layout_of_ty<'db>(
106106
&'db self,
107107
ty: crate::next_solver::Ty<'db>,
108-
env: Arc<TraitEnvironment>,
108+
env: Arc<TraitEnvironment<'db>>,
109109
) -> Result<Arc<Layout>, LayoutError>;
110110

111111
#[salsa::invoke(crate::layout::target_data_layout_query)]
@@ -182,12 +182,13 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
182182
#[salsa::invoke(crate::lower::generic_predicates_query)]
183183
fn generic_predicates(&self, def: GenericDefId) -> GenericPredicates;
184184

185-
#[salsa::invoke(crate::lower::trait_environment_for_body_query)]
185+
#[salsa::invoke(crate::lower_nextsolver::trait_environment_for_body_query)]
186186
#[salsa::transparent]
187-
fn trait_environment_for_body(&self, def: DefWithBodyId) -> Arc<TraitEnvironment>;
187+
fn trait_environment_for_body<'db>(&'db self, def: DefWithBodyId)
188+
-> Arc<TraitEnvironment<'db>>;
188189

189-
#[salsa::invoke(crate::lower::trait_environment_query)]
190-
fn trait_environment(&self, def: GenericDefId) -> Arc<TraitEnvironment>;
190+
#[salsa::invoke(crate::lower_nextsolver::trait_environment_query)]
191+
fn trait_environment<'db>(&'db self, def: GenericDefId) -> Arc<TraitEnvironment<'db>>;
191192

192193
#[salsa::invoke(crate::lower::generic_defaults_with_diagnostics_query)]
193194
#[salsa::cycle(cycle_result = crate::lower::generic_defaults_with_diagnostics_cycle_result)]
@@ -258,7 +259,7 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
258259
fn normalize_projection(
259260
&self,
260261
projection: crate::ProjectionTy,
261-
env: Arc<TraitEnvironment>,
262+
env: Arc<TraitEnvironment<'_>>,
262263
) -> Ty;
263264

264265
#[salsa::invoke(crate::traits::trait_solve_query)]
@@ -272,7 +273,7 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
272273

273274
#[salsa::invoke(crate::drop::has_drop_glue)]
274275
#[salsa::cycle(cycle_result = crate::drop::has_drop_glue_cycle_result)]
275-
fn has_drop_glue(&self, ty: Ty, env: Arc<TraitEnvironment>) -> DropGlue;
276+
fn has_drop_glue(&self, ty: Ty, env: Arc<TraitEnvironment<'_>>) -> DropGlue;
276277

277278
// next trait solver
278279

crates/hir-ty/src/diagnostics/expr.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,17 @@ impl BodyValidationDiagnostic {
8181
}
8282
}
8383

84-
struct ExprValidator {
84+
struct ExprValidator<'db> {
8585
owner: DefWithBodyId,
8686
body: Arc<Body>,
8787
infer: Arc<InferenceResult>,
88-
env: Arc<TraitEnvironment>,
88+
env: Arc<TraitEnvironment<'db>>,
8989
diagnostics: Vec<BodyValidationDiagnostic>,
9090
validate_lints: bool,
9191
}
9292

93-
impl ExprValidator {
94-
fn validate_body(&mut self, db: &dyn HirDatabase) {
93+
impl<'db> ExprValidator<'db> {
94+
fn validate_body(&mut self, db: &'db dyn HirDatabase) {
9595
let mut filter_map_next_checker = None;
9696
// we'll pass &mut self while iterating over body.exprs, so they need to be disjoint
9797
let body = Arc::clone(&self.body);

crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,15 @@ pub(crate) struct MatchCheckCtx<'db> {
7070
body: DefWithBodyId,
7171
pub(crate) db: &'db dyn HirDatabase,
7272
exhaustive_patterns: bool,
73-
env: Arc<TraitEnvironment>,
73+
env: Arc<TraitEnvironment<'db>>,
7474
}
7575

7676
impl<'db> MatchCheckCtx<'db> {
7777
pub(crate) fn new(
7878
module: ModuleId,
7979
body: DefWithBodyId,
8080
db: &'db dyn HirDatabase,
81-
env: Arc<TraitEnvironment>,
81+
env: Arc<TraitEnvironment<'db>>,
8282
) -> Self {
8383
let def_map = module.crate_def_map(db);
8484
let exhaustive_patterns = def_map.is_unstable_feature_enabled(&sym::exhaustive_patterns);

crates/hir-ty/src/display.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -792,19 +792,16 @@ fn render_const_scalar_ns(
792792
let trait_env = TraitEnvironment::empty(f.krate());
793793
let interner = DbInterner::new_with(f.db, Some(trait_env.krate), trait_env.block);
794794
let infcx = interner.infer_ctxt().build(rustc_type_ir::TypingMode::PostAnalysis);
795-
let ty = infcx
796-
.at(&ObligationCause::new(), trait_env.env.to_nextsolver(interner))
797-
.deeply_normalize(ty)
798-
.unwrap_or(ty);
795+
let ty = infcx.at(&ObligationCause::new(), trait_env.env).deeply_normalize(ty).unwrap_or(ty);
799796
render_const_scalar_inner(f, b, memory_map, ty, trait_env)
800797
}
801798

802-
fn render_const_scalar_inner(
799+
fn render_const_scalar_inner<'db>(
803800
f: &mut HirFormatter<'_>,
804801
b: &[u8],
805802
memory_map: &MemoryMap<'_>,
806-
ty: crate::next_solver::Ty<'_>,
807-
trait_env: Arc<TraitEnvironment>,
803+
ty: crate::next_solver::Ty<'db>,
804+
trait_env: Arc<TraitEnvironment<'db>>,
808805
) -> Result<(), HirDisplayError> {
809806
use rustc_type_ir::TyKind;
810807
match ty.kind() {
@@ -1068,11 +1065,11 @@ fn render_const_scalar_inner(
10681065
}
10691066
}
10701067

1071-
fn render_variant_after_name(
1068+
fn render_variant_after_name<'db>(
10721069
data: &VariantFields,
10731070
f: &mut HirFormatter<'_>,
10741071
field_types: &ArenaMap<LocalFieldId, Binders<Ty>>,
1075-
trait_env: Arc<TraitEnvironment>,
1072+
trait_env: Arc<TraitEnvironment<'db>>,
10761073
layout: &Layout,
10771074
args: GenericArgs<'_>,
10781075
b: &[u8],

crates/hir-ty/src/drop.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ use hir_def::signatures::StructFlags;
77
use stdx::never;
88
use triomphe::Arc;
99

10+
use crate::next_solver::DbInterner;
11+
use crate::next_solver::mapping::NextSolverToChalk;
1012
use crate::{
1113
AliasTy, Canonical, CanonicalVarKinds, ConcreteConst, ConstScalar, ConstValue, InEnvironment,
1214
Interner, ProjectionTy, TraitEnvironment, Ty, TyBuilder, TyKind, db::HirDatabase,
@@ -43,7 +45,11 @@ pub enum DropGlue {
4345
HasDropGlue,
4446
}
4547

46-
pub(crate) fn has_drop_glue(db: &dyn HirDatabase, ty: Ty, env: Arc<TraitEnvironment>) -> DropGlue {
48+
pub(crate) fn has_drop_glue(
49+
db: &dyn HirDatabase,
50+
ty: Ty,
51+
env: Arc<TraitEnvironment<'_>>,
52+
) -> DropGlue {
4753
match ty.kind(Interner) {
4854
TyKind::Adt(adt, subst) => {
4955
if has_destructor(db, adt.0) {
@@ -165,7 +171,7 @@ pub(crate) fn has_drop_glue(db: &dyn HirDatabase, ty: Ty, env: Arc<TraitEnvironm
165171

166172
fn projection_has_drop_glue(
167173
db: &dyn HirDatabase,
168-
env: Arc<TraitEnvironment>,
174+
env: Arc<TraitEnvironment<'_>>,
169175
projection: ProjectionTy,
170176
ty: Ty,
171177
) -> DropGlue {
@@ -178,13 +184,16 @@ fn projection_has_drop_glue(
178184
}
179185
}
180186

181-
fn is_copy(db: &dyn HirDatabase, ty: Ty, env: Arc<TraitEnvironment>) -> bool {
187+
fn is_copy(db: &dyn HirDatabase, ty: Ty, env: Arc<TraitEnvironment<'_>>) -> bool {
182188
let Some(copy_trait) = LangItem::Copy.resolve_trait(db, env.krate) else {
183189
return false;
184190
};
185191
let trait_ref = TyBuilder::trait_ref(db, copy_trait).push(ty).build();
186192
let goal = Canonical {
187-
value: InEnvironment::new(&env.env, trait_ref.cast(Interner)),
193+
value: InEnvironment::new(
194+
&env.env.to_chalk(DbInterner::new_with(db, Some(env.krate), env.block)),
195+
trait_ref.cast(Interner),
196+
),
188197
binders: CanonicalVarKinds::empty(Interner),
189198
};
190199
db.trait_solve(env.krate, env.block, goal).certain()
@@ -193,7 +202,7 @@ fn is_copy(db: &dyn HirDatabase, ty: Ty, env: Arc<TraitEnvironment>) -> bool {
193202
pub(crate) fn has_drop_glue_cycle_result(
194203
_db: &dyn HirDatabase,
195204
_ty: Ty,
196-
_env: Arc<TraitEnvironment>,
205+
_env: Arc<TraitEnvironment<'_>>,
197206
) -> DropGlue {
198207
DropGlue::None
199208
}

crates/hir-ty/src/infer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ pub(crate) fn infer_cycle_result(_: &dyn HirDatabase, _: DefWithBodyId) -> Arc<I
152152
/// This is appropriate to use only after type-check: it assumes
153153
/// that normalization will succeed, for example.
154154
#[tracing::instrument(level = "debug", skip(db))]
155-
pub(crate) fn normalize(db: &dyn HirDatabase, trait_env: Arc<TraitEnvironment>, ty: Ty) -> Ty {
155+
pub(crate) fn normalize(db: &dyn HirDatabase, trait_env: Arc<TraitEnvironment<'_>>, ty: Ty) -> Ty {
156156
// FIXME: TypeFlags::HAS_CT_PROJECTION is not implemented in chalk, so TypeFlags::HAS_PROJECTION only
157157
// works for the type case, so we check array unconditionally. Remove the array part
158158
// when the bug in chalk becomes fixed.

crates/hir-ty/src/infer/closure.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ impl<'db> InferenceContext<'db> {
318318
_ = self
319319
.table
320320
.infer_ctxt
321-
.at(&ObligationCause::new(), self.table.param_env)
321+
.at(&ObligationCause::new(), self.table.trait_env.env)
322322
.eq(DefineOpaqueTypes::Yes, inferred_fnptr_sig, generalized_fnptr_sig)
323323
.map(|infer_ok| self.table.register_infer_ok(infer_ok));
324324

@@ -703,15 +703,15 @@ impl<'db> InferenceContext<'db> {
703703
let cause = ObligationCause::new();
704704
let InferOk { value: (), obligations } = table
705705
.infer_ctxt
706-
.at(&cause, table.param_env)
706+
.at(&cause, table.trait_env.env)
707707
.eq(DefineOpaqueTypes::Yes, expected_ty, supplied_ty)?;
708708
all_obligations.extend(obligations);
709709
}
710710

711711
let supplied_output_ty = supplied_sig.output();
712712
let cause = ObligationCause::new();
713713
let InferOk { value: (), obligations } =
714-
table.infer_ctxt.at(&cause, table.param_env).eq(
714+
table.infer_ctxt.at(&cause, table.trait_env.env).eq(
715715
DefineOpaqueTypes::Yes,
716716
expected_sigs.liberated_sig.output(),
717717
supplied_output_ty,

0 commit comments

Comments
 (0)