From 4efd70d5f0b6bdde49c589cadf565fae117d377e Mon Sep 17 00:00:00 2001 From: Chayim Refael Friedman Date: Wed, 15 Oct 2025 16:12:41 +0300 Subject: [PATCH] Make more new-trait-solver-things have specific ID type --- compiler/rustc_middle/src/ty/context.rs | 1 + .../src/solve/assembly/structural_traits.rs | 2 +- compiler/rustc_next_trait_solver/src/solve/mod.rs | 2 +- .../src/solve/normalizes_to/anon_const.rs | 5 ++++- compiler/rustc_type_ir/src/const_kind.rs | 4 ++-- compiler/rustc_type_ir/src/interner.rs | 6 +++++- compiler/rustc_type_ir/src/predicate.rs | 4 ++-- compiler/rustc_type_ir/src/relate.rs | 4 ++-- 8 files changed, 18 insertions(+), 10 deletions(-) diff --git a/compiler/rustc_middle/src/ty/context.rs b/compiler/rustc_middle/src/ty/context.rs index 3c5c21a7a89c..efafc0eba31c 100644 --- a/compiler/rustc_middle/src/ty/context.rs +++ b/compiler/rustc_middle/src/ty/context.rs @@ -102,6 +102,7 @@ impl<'tcx> Interner for TyCtxt<'tcx> { type CoroutineId = DefId; type AdtId = DefId; type ImplId = DefId; + type UnevaluatedConstId = DefId; type Span = Span; type GenericArgs = ty::GenericArgsRef<'tcx>; diff --git a/compiler/rustc_next_trait_solver/src/solve/assembly/structural_traits.rs b/compiler/rustc_next_trait_solver/src/solve/assembly/structural_traits.rs index 9b3dc1f691fb..2f6ff12e1e8d 100644 --- a/compiler/rustc_next_trait_solver/src/solve/assembly/structural_traits.rs +++ b/compiler/rustc_next_trait_solver/src/solve/assembly/structural_traits.rs @@ -870,7 +870,7 @@ where // FIXME(associated_const_equality): Also add associated consts to // the requirements here. - for associated_type_def_id in cx.associated_type_def_ids(trait_ref.def_id.into()) { + for associated_type_def_id in cx.associated_type_def_ids(trait_ref.def_id) { // associated types that require `Self: Sized` do not show up in the built-in // implementation of `Trait for dyn Trait`, and can be dropped here. if cx.generics_require_sized_self(associated_type_def_id) { diff --git a/compiler/rustc_next_trait_solver/src/solve/mod.rs b/compiler/rustc_next_trait_solver/src/solve/mod.rs index a58caeecc33c..52c4a7762909 100644 --- a/compiler/rustc_next_trait_solver/src/solve/mod.rs +++ b/compiler/rustc_next_trait_solver/src/solve/mod.rs @@ -218,7 +218,7 @@ where return self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes); } ty::ConstKind::Unevaluated(uv) => { - self.cx().type_of(uv.def).instantiate(self.cx(), uv.args) + self.cx().type_of(uv.def.into()).instantiate(self.cx(), uv.args) } ty::ConstKind::Expr(_) => unimplemented!( "`feature(generic_const_exprs)` is not supported in the new trait solver" diff --git a/compiler/rustc_next_trait_solver/src/solve/normalizes_to/anon_const.rs b/compiler/rustc_next_trait_solver/src/solve/normalizes_to/anon_const.rs index 8ad0bf5cdf9a..46312be5ea9a 100644 --- a/compiler/rustc_next_trait_solver/src/solve/normalizes_to/anon_const.rs +++ b/compiler/rustc_next_trait_solver/src/solve/normalizes_to/anon_const.rs @@ -16,7 +16,10 @@ where ) -> QueryResult { if let Some(normalized_const) = self.evaluate_const( goal.param_env, - ty::UnevaluatedConst::new(goal.predicate.alias.def_id, goal.predicate.alias.args), + ty::UnevaluatedConst::new( + goal.predicate.alias.def_id.try_into().unwrap(), + goal.predicate.alias.args, + ), ) { self.instantiate_normalizes_to_term(goal, normalized_const.into()); self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes) diff --git a/compiler/rustc_type_ir/src/const_kind.rs b/compiler/rustc_type_ir/src/const_kind.rs index 273b60960087..8393bbe5caf8 100644 --- a/compiler/rustc_type_ir/src/const_kind.rs +++ b/compiler/rustc_type_ir/src/const_kind.rs @@ -72,7 +72,7 @@ impl fmt::Debug for ConstKind { derive(Decodable_NoContext, Encodable_NoContext, HashStable_NoContext) )] pub struct UnevaluatedConst { - pub def: I::DefId, + pub def: I::UnevaluatedConstId, pub args: I::GenericArgs, } @@ -80,7 +80,7 @@ impl Eq for UnevaluatedConst {} impl UnevaluatedConst { #[inline] - pub fn new(def: I::DefId, args: I::GenericArgs) -> UnevaluatedConst { + pub fn new(def: I::UnevaluatedConstId, args: I::GenericArgs) -> UnevaluatedConst { UnevaluatedConst { def, args } } } diff --git a/compiler/rustc_type_ir/src/interner.rs b/compiler/rustc_type_ir/src/interner.rs index 4b6349e2f426..3b07befa34f1 100644 --- a/compiler/rustc_type_ir/src/interner.rs +++ b/compiler/rustc_type_ir/src/interner.rs @@ -53,6 +53,7 @@ pub trait Interner: type CoroutineId: SpecificDefId; type AdtId: SpecificDefId; type ImplId: SpecificDefId; + type UnevaluatedConstId: SpecificDefId; type Span: Span; type GenericArgs: GenericArgs; @@ -339,7 +340,10 @@ pub trait Interner: fn as_adt_lang_item(self, def_id: Self::AdtId) -> Option; - fn associated_type_def_ids(self, def_id: Self::DefId) -> impl IntoIterator; + fn associated_type_def_ids( + self, + def_id: Self::TraitId, + ) -> impl IntoIterator; fn for_each_relevant_impl( self, diff --git a/compiler/rustc_type_ir/src/predicate.rs b/compiler/rustc_type_ir/src/predicate.rs index a3300b88c431..3e32a7788546 100644 --- a/compiler/rustc_type_ir/src/predicate.rs +++ b/compiler/rustc_type_ir/src/predicate.rs @@ -655,7 +655,7 @@ impl AliasTerm { | AliasTermKind::UnevaluatedConst | AliasTermKind::ProjectionConst => I::Const::new_unevaluated( interner, - ty::UnevaluatedConst::new(self.def_id, self.args), + ty::UnevaluatedConst::new(self.def_id.try_into().unwrap(), self.args), ) .into(), } @@ -747,7 +747,7 @@ impl From> for AliasTerm { impl From> for AliasTerm { fn from(ct: ty::UnevaluatedConst) -> Self { - AliasTerm { args: ct.args, def_id: ct.def, _use_alias_term_new_instead: () } + AliasTerm { args: ct.args, def_id: ct.def.into(), _use_alias_term_new_instead: () } } } diff --git a/compiler/rustc_type_ir/src/relate.rs b/compiler/rustc_type_ir/src/relate.rs index 09add529286d..fc74cbf47823 100644 --- a/compiler/rustc_type_ir/src/relate.rs +++ b/compiler/rustc_type_ir/src/relate.rs @@ -608,8 +608,8 @@ pub fn structurally_relate_consts>( // be stabilized. (ty::ConstKind::Unevaluated(au), ty::ConstKind::Unevaluated(bu)) if au.def == bu.def => { if cfg!(debug_assertions) { - let a_ty = cx.type_of(au.def).instantiate(cx, au.args); - let b_ty = cx.type_of(bu.def).instantiate(cx, bu.args); + let a_ty = cx.type_of(au.def.into()).instantiate(cx, au.args); + let b_ty = cx.type_of(bu.def.into()).instantiate(cx, bu.args); assert_eq!(a_ty, b_ty); }