Rename a bunch of things

This commit is contained in:
Michael Goulet 2024-06-18 19:13:54 -04:00
parent 25c9f2ca06
commit db638ab968
60 changed files with 538 additions and 566 deletions

View File

@ -1110,7 +1110,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
} }
impl<'tcx> ty::TypeFolder<TyCtxt<'tcx>> for OpaqueFolder<'tcx> { impl<'tcx> ty::TypeFolder<TyCtxt<'tcx>> for OpaqueFolder<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> { fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {

View File

@ -397,7 +397,7 @@ struct RemapLateBound<'a, 'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for RemapLateBound<'_, 'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for RemapLateBound<'_, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
@ -790,13 +790,13 @@ impl<'tcx, E> TypeFolder<TyCtxt<'tcx>> for ImplTraitInTraitCollector<'_, 'tcx, E
where where
E: 'tcx, E: 'tcx,
{ {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.ocx.infcx.tcx self.ocx.infcx.tcx
} }
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> { fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
if let ty::Alias(ty::Projection, proj) = ty.kind() if let ty::Alias(ty::Projection, proj) = ty.kind()
&& self.interner().is_impl_trait_in_trait(proj.def_id) && self.cx().is_impl_trait_in_trait(proj.def_id)
{ {
if let Some((ty, _)) = self.types.get(&proj.def_id) { if let Some((ty, _)) = self.types.get(&proj.def_id) {
return *ty; return *ty;
@ -810,9 +810,9 @@ where
self.types.insert(proj.def_id, (infer_ty, proj.args)); self.types.insert(proj.def_id, (infer_ty, proj.args));
// Recurse into bounds // Recurse into bounds
for (pred, pred_span) in self for (pred, pred_span) in self
.interner() .cx()
.explicit_item_bounds(proj.def_id) .explicit_item_bounds(proj.def_id)
.iter_instantiated_copied(self.interner(), proj.args) .iter_instantiated_copied(self.cx(), proj.args)
{ {
let pred = pred.fold_with(self); let pred = pred.fold_with(self);
let pred = self.ocx.normalize( let pred = self.ocx.normalize(
@ -822,7 +822,7 @@ where
); );
self.ocx.register_obligation(traits::Obligation::new( self.ocx.register_obligation(traits::Obligation::new(
self.interner(), self.cx(),
ObligationCause::new( ObligationCause::new(
self.span, self.span,
self.body_id, self.body_id,
@ -853,7 +853,7 @@ struct RemapHiddenTyRegions<'tcx> {
impl<'tcx> ty::FallibleTypeFolder<TyCtxt<'tcx>> for RemapHiddenTyRegions<'tcx> { impl<'tcx> ty::FallibleTypeFolder<TyCtxt<'tcx>> for RemapHiddenTyRegions<'tcx> {
type Error = ErrorGuaranteed; type Error = ErrorGuaranteed;
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
@ -2072,7 +2072,7 @@ struct ReplaceTy<'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ReplaceTy<'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ReplaceTy<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }

View File

@ -322,7 +322,7 @@ struct Anonymize<'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for Anonymize<'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for Anonymize<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }

View File

@ -539,7 +539,7 @@ struct TyVarReplacer<'cx, 'tcx> {
} }
impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for TyVarReplacer<'cx, 'tcx> { impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for TyVarReplacer<'cx, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.infcx.tcx self.infcx.tcx
} }

View File

@ -203,7 +203,7 @@ struct AssocTyToOpaque<'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for AssocTyToOpaque<'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for AssocTyToOpaque<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }

View File

@ -847,7 +847,7 @@ impl<'cx, 'tcx> Resolver<'cx, 'tcx> {
} }
impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Resolver<'cx, 'tcx> { impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Resolver<'cx, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.fcx.tcx self.fcx.tcx
} }

View File

@ -304,7 +304,7 @@ struct Canonicalizer<'cx, 'tcx> {
} }
impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> { impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
@ -773,7 +773,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
) -> ty::Region<'tcx> { ) -> ty::Region<'tcx> {
let var = self.canonical_var(info, r.into()); let var = self.canonical_var(info, r.into());
let br = ty::BoundRegion { var, kind: ty::BrAnon }; let br = ty::BoundRegion { var, kind: ty::BrAnon };
ty::Region::new_bound(self.interner(), self.binder_index, br) ty::Region::new_bound(self.cx(), self.binder_index, br)
} }
/// Given a type variable `ty_var` of the given kind, first check /// Given a type variable `ty_var` of the given kind, first check

View File

@ -158,7 +158,7 @@ struct ClosureEraser<'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ClosureEraser<'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ClosureEraser<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }

View File

@ -101,7 +101,7 @@ impl<'a, 'tcx> TypeFreshener<'a, 'tcx> {
} }
impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for TypeFreshener<'a, 'tcx> { impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for TypeFreshener<'a, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.infcx.tcx self.infcx.tcx
} }
@ -118,7 +118,7 @@ impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for TypeFreshener<'a, 'tcx> {
| ty::RePlaceholder(..) | ty::RePlaceholder(..)
| ty::ReStatic | ty::ReStatic
| ty::ReError(_) | ty::ReError(_)
| ty::ReErased => self.interner().lifetimes.re_erased, | ty::ReErased => self.cx().lifetimes.re_erased,
} }
} }

View File

@ -1719,7 +1719,7 @@ struct InferenceLiteralEraser<'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for InferenceLiteralEraser<'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for InferenceLiteralEraser<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
@ -1859,7 +1859,7 @@ fn replace_param_and_infer_args_with_placeholder<'tcx>(
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ReplaceParamAndInferWithPlaceholder<'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ReplaceParamAndInferWithPlaceholder<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }

View File

@ -24,7 +24,7 @@ impl<'a, 'tcx> OpportunisticVarResolver<'a, 'tcx> {
} }
impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for OpportunisticVarResolver<'a, 'tcx> { impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for OpportunisticVarResolver<'a, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.infcx.tcx self.infcx.tcx
} }
@ -66,7 +66,7 @@ impl<'a, 'tcx> OpportunisticRegionResolver<'a, 'tcx> {
} }
impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for OpportunisticRegionResolver<'a, 'tcx> { impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for OpportunisticRegionResolver<'a, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.infcx.tcx self.infcx.tcx
} }
@ -85,7 +85,7 @@ impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for OpportunisticRegionResolver<'a, 'tcx
.inner .inner
.borrow_mut() .borrow_mut()
.unwrap_region_constraints() .unwrap_region_constraints()
.opportunistic_resolve_var(TypeFolder::interner(self), vid), .opportunistic_resolve_var(TypeFolder::cx(self), vid),
_ => r, _ => r,
} }
} }
@ -121,7 +121,7 @@ struct FullTypeResolver<'a, 'tcx> {
impl<'a, 'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for FullTypeResolver<'a, 'tcx> { impl<'a, 'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for FullTypeResolver<'a, 'tcx> {
type Error = FixupError; type Error = FixupError;
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.infcx.tcx self.infcx.tcx
} }

View File

@ -183,7 +183,7 @@ pub struct InferenceFudger<'a, 'tcx> {
} }
impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for InferenceFudger<'a, 'tcx> { impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for InferenceFudger<'a, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.infcx.tcx self.infcx.tcx
} }

View File

@ -390,7 +390,7 @@ struct ReplaceLocalTypesWithInfer<'a, 'tcx, F: FnMut(DefId) -> bool> {
impl<'a, 'tcx, F: FnMut(DefId) -> bool> TypeFolder<TyCtxt<'tcx>> impl<'a, 'tcx, F: FnMut(DefId) -> bool> TypeFolder<TyCtxt<'tcx>>
for ReplaceLocalTypesWithInfer<'a, 'tcx, F> for ReplaceLocalTypesWithInfer<'a, 'tcx, F>
{ {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.infcx.tcx self.infcx.tcx
} }

View File

@ -53,7 +53,7 @@ impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for ExternalConstraints<'tcx> {
self, self,
folder: &mut F, folder: &mut F,
) -> Result<Self, F::Error> { ) -> Result<Self, F::Error> {
Ok(FallibleTypeFolder::interner(folder).mk_external_constraints(ExternalConstraintsData { Ok(FallibleTypeFolder::cx(folder).mk_external_constraints(ExternalConstraintsData {
region_constraints: self.region_constraints.clone().try_fold_with(folder)?, region_constraints: self.region_constraints.clone().try_fold_with(folder)?,
opaque_types: self opaque_types: self
.opaque_types .opaque_types
@ -68,7 +68,7 @@ impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for ExternalConstraints<'tcx> {
} }
fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self { fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
TypeFolder::interner(folder).mk_external_constraints(ExternalConstraintsData { TypeFolder::cx(folder).mk_external_constraints(ExternalConstraintsData {
region_constraints: self.region_constraints.clone().fold_with(folder), region_constraints: self.region_constraints.clone().fold_with(folder),
opaque_types: self.opaque_types.iter().map(|opaque| opaque.fold_with(folder)).collect(), opaque_types: self.opaque_types.iter().map(|opaque| opaque.fold_with(folder)).collect(),
normalization_nested_goals: self.normalization_nested_goals.clone().fold_with(folder), normalization_nested_goals: self.normalization_nested_goals.clone().fold_with(folder),
@ -94,19 +94,17 @@ impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for PredefinedOpaques<'tcx> {
self, self,
folder: &mut F, folder: &mut F,
) -> Result<Self, F::Error> { ) -> Result<Self, F::Error> {
Ok(FallibleTypeFolder::interner(folder).mk_predefined_opaques_in_body( Ok(FallibleTypeFolder::cx(folder).mk_predefined_opaques_in_body(PredefinedOpaquesData {
PredefinedOpaquesData {
opaque_types: self opaque_types: self
.opaque_types .opaque_types
.iter() .iter()
.map(|opaque| opaque.try_fold_with(folder)) .map(|opaque| opaque.try_fold_with(folder))
.collect::<Result<_, F::Error>>()?, .collect::<Result<_, F::Error>>()?,
}, }))
))
} }
fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self { fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
TypeFolder::interner(folder).mk_predefined_opaques_in_body(PredefinedOpaquesData { TypeFolder::cx(folder).mk_predefined_opaques_in_body(PredefinedOpaquesData {
opaque_types: self.opaque_types.iter().map(|opaque| opaque.fold_with(folder)).collect(), opaque_types: self.opaque_types.iter().map(|opaque| opaque.fold_with(folder)).collect(),
}) })
} }

View File

@ -41,7 +41,7 @@ impl<'tcx> TyCtxt<'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for Expander<'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for Expander<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> { fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {

View File

@ -579,7 +579,7 @@ pub struct MakeSuggestableFolder<'tcx> {
impl<'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for MakeSuggestableFolder<'tcx> { impl<'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for MakeSuggestableFolder<'tcx> {
type Error = (); type Error = ();
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }

View File

@ -37,7 +37,7 @@ struct RegionEraserVisitor<'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for RegionEraserVisitor<'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for RegionEraserVisitor<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }

View File

@ -28,7 +28,7 @@ where
G: FnMut(ty::Region<'tcx>) -> ty::Region<'tcx>, G: FnMut(ty::Region<'tcx>) -> ty::Region<'tcx>,
H: FnMut(ty::Const<'tcx>) -> ty::Const<'tcx>, H: FnMut(ty::Const<'tcx>) -> ty::Const<'tcx>,
{ {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
@ -99,7 +99,7 @@ impl<'a, 'tcx> RegionFolder<'a, 'tcx> {
} }
impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for RegionFolder<'a, 'tcx> { impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for RegionFolder<'a, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
@ -176,7 +176,7 @@ impl<'tcx, D> TypeFolder<TyCtxt<'tcx>> for BoundVarReplacer<'tcx, D>
where where
D: BoundVarReplacerDelegate<'tcx>, D: BoundVarReplacerDelegate<'tcx>,
{ {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }

View File

@ -591,7 +591,7 @@ impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for GenericArgsRef<'tcx> {
match self.len() { match self.len() {
1 => { 1 => {
let param0 = self[0].try_fold_with(folder)?; let param0 = self[0].try_fold_with(folder)?;
if param0 == self[0] { Ok(self) } else { Ok(folder.interner().mk_args(&[param0])) } if param0 == self[0] { Ok(self) } else { Ok(folder.cx().mk_args(&[param0])) }
} }
2 => { 2 => {
let param0 = self[0].try_fold_with(folder)?; let param0 = self[0].try_fold_with(folder)?;
@ -599,7 +599,7 @@ impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for GenericArgsRef<'tcx> {
if param0 == self[0] && param1 == self[1] { if param0 == self[0] && param1 == self[1] {
Ok(self) Ok(self)
} else { } else {
Ok(folder.interner().mk_args(&[param0, param1])) Ok(folder.cx().mk_args(&[param0, param1]))
} }
} }
0 => Ok(self), 0 => Ok(self),
@ -635,7 +635,7 @@ impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for &'tcx ty::List<Ty<'tcx>> {
if param0 == self[0] && param1 == self[1] { if param0 == self[0] && param1 == self[1] {
Ok(self) Ok(self)
} else { } else {
Ok(folder.interner().mk_type_list(&[param0, param1])) Ok(folder.cx().mk_type_list(&[param0, param1]))
} }
} }
_ => ty::util::fold_list(self, folder, |tcx, v| tcx.mk_type_list(v)), _ => ty::util::fold_list(self, folder, |tcx, v| tcx.mk_type_list(v)),

View File

@ -873,7 +873,7 @@ fn polymorphize<'tcx>(
} }
impl<'tcx> ty::TypeFolder<TyCtxt<'tcx>> for PolymorphizationFolder<'tcx> { impl<'tcx> ty::TypeFolder<TyCtxt<'tcx>> for PolymorphizationFolder<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }

View File

@ -173,7 +173,7 @@ impl<'tcx> NormalizeAfterErasingRegionsFolder<'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for NormalizeAfterErasingRegionsFolder<'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for NormalizeAfterErasingRegionsFolder<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
@ -211,7 +211,7 @@ impl<'tcx> TryNormalizeAfterErasingRegionsFolder<'tcx> {
impl<'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for TryNormalizeAfterErasingRegionsFolder<'tcx> { impl<'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for TryNormalizeAfterErasingRegionsFolder<'tcx> {
type Error = NormalizationError<'tcx>; type Error = NormalizationError<'tcx>;
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }

View File

@ -95,7 +95,7 @@ impl<'tcx> ReverseMapper<'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ReverseMapper<'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ReverseMapper<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
@ -144,7 +144,7 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ReverseMapper<'tcx> {
) )
.emit(); .emit();
ty::Region::new_error(self.interner(), e) ty::Region::new_error(self.cx(), e)
} }
} }
} }

View File

@ -2529,7 +2529,7 @@ struct RegionFolder<'a, 'tcx> {
} }
impl<'a, 'tcx> ty::TypeFolder<TyCtxt<'tcx>> for RegionFolder<'a, 'tcx> { impl<'a, 'tcx> ty::TypeFolder<TyCtxt<'tcx>> for RegionFolder<'a, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }

View File

@ -335,7 +335,7 @@ impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for Pattern<'tcx> {
folder: &mut F, folder: &mut F,
) -> Result<Self, F::Error> { ) -> Result<Self, F::Error> {
let pat = (*self).clone().try_fold_with(folder)?; let pat = (*self).clone().try_fold_with(folder)?;
Ok(if pat == *self { self } else { folder.interner().mk_pat(pat) }) Ok(if pat == *self { self } else { folder.cx().mk_pat(pat) })
} }
} }
@ -407,7 +407,7 @@ impl<'tcx> TypeSuperFoldable<TyCtxt<'tcx>> for Ty<'tcx> {
| ty::Foreign(..) => return Ok(self), | ty::Foreign(..) => return Ok(self),
}; };
Ok(if *self.kind() == kind { self } else { folder.interner().mk_ty_from_kind(kind) }) Ok(if *self.kind() == kind { self } else { folder.cx().mk_ty_from_kind(kind) })
} }
} }
@ -512,7 +512,7 @@ impl<'tcx> TypeSuperFoldable<TyCtxt<'tcx>> for ty::Predicate<'tcx> {
folder: &mut F, folder: &mut F,
) -> Result<Self, F::Error> { ) -> Result<Self, F::Error> {
let new = self.kind().try_fold_with(folder)?; let new = self.kind().try_fold_with(folder)?;
Ok(folder.interner().reuse_or_mk_predicate(self, new)) Ok(folder.cx().reuse_or_mk_predicate(self, new))
} }
} }
@ -577,7 +577,7 @@ impl<'tcx> TypeSuperFoldable<TyCtxt<'tcx>> for ty::Const<'tcx> {
ConstKind::Error(e) => ConstKind::Error(e.try_fold_with(folder)?), ConstKind::Error(e) => ConstKind::Error(e.try_fold_with(folder)?),
ConstKind::Expr(e) => ConstKind::Expr(e.try_fold_with(folder)?), ConstKind::Expr(e) => ConstKind::Expr(e.try_fold_with(folder)?),
}; };
if kind != self.kind() { Ok(folder.interner().mk_ct_from_kind(kind)) } else { Ok(self) } if kind != self.kind() { Ok(folder.cx().mk_ct_from_kind(kind)) } else { Ok(self) }
} }
} }

View File

@ -1083,7 +1083,7 @@ impl<'tcx> OpaqueTypeExpander<'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for OpaqueTypeExpander<'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for OpaqueTypeExpander<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
@ -1130,7 +1130,7 @@ struct WeakAliasTypeExpander<'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for WeakAliasTypeExpander<'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for WeakAliasTypeExpander<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
@ -1795,7 +1795,7 @@ where
for t in iter { for t in iter {
new_list.push(t.try_fold_with(folder)?) new_list.push(t.try_fold_with(folder)?)
} }
Ok(intern(folder.interner(), &new_list)) Ok(intern(folder.cx(), &new_list))
} }
Some((_, Err(err))) => { Some((_, Err(err))) => {
return Err(err); return Err(err);

View File

@ -7,7 +7,7 @@ use rustc_type_ir::{
self as ty, Canonical, CanonicalTyVarKind, CanonicalVarInfo, CanonicalVarKind, Interner, self as ty, Canonical, CanonicalTyVarKind, CanonicalVarInfo, CanonicalVarKind, Interner,
}; };
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
/// Whether we're canonicalizing a query input or the query response. /// Whether we're canonicalizing a query input or the query response.
/// ///
@ -38,8 +38,8 @@ pub enum CanonicalizeMode {
}, },
} }
pub struct Canonicalizer<'a, Infcx: SolverDelegate<Interner = I>, I: Interner> { pub struct Canonicalizer<'a, D: SolverDelegate<Interner = I>, I: Interner> {
infcx: &'a Infcx, delegate: &'a D,
canonicalize_mode: CanonicalizeMode, canonicalize_mode: CanonicalizeMode,
variables: &'a mut Vec<I::GenericArg>, variables: &'a mut Vec<I::GenericArg>,
@ -47,15 +47,15 @@ pub struct Canonicalizer<'a, Infcx: SolverDelegate<Interner = I>, I: Interner> {
binder_index: ty::DebruijnIndex, binder_index: ty::DebruijnIndex,
} }
impl<'a, Infcx: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, Infcx, I> { impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
pub fn canonicalize<T: TypeFoldable<I>>( pub fn canonicalize<T: TypeFoldable<I>>(
infcx: &'a Infcx, delegate: &'a D,
canonicalize_mode: CanonicalizeMode, canonicalize_mode: CanonicalizeMode,
variables: &'a mut Vec<I::GenericArg>, variables: &'a mut Vec<I::GenericArg>,
value: T, value: T,
) -> ty::Canonical<I, T> { ) -> ty::Canonical<I, T> {
let mut canonicalizer = Canonicalizer { let mut canonicalizer = Canonicalizer {
infcx, delegate,
canonicalize_mode, canonicalize_mode,
variables, variables,
@ -70,7 +70,7 @@ impl<'a, Infcx: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, Inf
let (max_universe, variables) = canonicalizer.finalize(); let (max_universe, variables) = canonicalizer.finalize();
let defining_opaque_types = infcx.defining_opaque_types(); let defining_opaque_types = delegate.defining_opaque_types();
Canonical { defining_opaque_types, max_universe, variables, value } Canonical { defining_opaque_types, max_universe, variables, value }
} }
@ -102,7 +102,7 @@ impl<'a, Infcx: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, Inf
.max() .max()
.unwrap_or(ty::UniverseIndex::ROOT); .unwrap_or(ty::UniverseIndex::ROOT);
let var_infos = self.infcx.interner().mk_canonical_var_infos(&var_infos); let var_infos = self.delegate.cx().mk_canonical_var_infos(&var_infos);
return (max_universe, var_infos); return (max_universe, var_infos);
} }
} }
@ -206,16 +206,14 @@ impl<'a, Infcx: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, Inf
} }
} }
let var_infos = self.infcx.interner().mk_canonical_var_infos(&var_infos); let var_infos = self.delegate.cx().mk_canonical_var_infos(&var_infos);
(curr_compressed_uv, var_infos) (curr_compressed_uv, var_infos)
} }
} }
impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> impl<D: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> for Canonicalizer<'_, D, I> {
for Canonicalizer<'_, Infcx, I> fn cx(&self) -> I {
{ self.delegate.cx()
fn interner(&self) -> I {
self.infcx.interner()
} }
fn fold_binder<T>(&mut self, t: ty::Binder<I, T>) -> ty::Binder<I, T> fn fold_binder<T>(&mut self, t: ty::Binder<I, T>) -> ty::Binder<I, T>
@ -267,14 +265,14 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I>
ty::ReVar(vid) => { ty::ReVar(vid) => {
assert_eq!( assert_eq!(
self.infcx.opportunistic_resolve_lt_var(vid), self.delegate.opportunistic_resolve_lt_var(vid),
r, r,
"region vid should have been resolved fully before canonicalization" "region vid should have been resolved fully before canonicalization"
); );
match self.canonicalize_mode { match self.canonicalize_mode {
CanonicalizeMode::Input => CanonicalVarKind::Region(ty::UniverseIndex::ROOT), CanonicalizeMode::Input => CanonicalVarKind::Region(ty::UniverseIndex::ROOT),
CanonicalizeMode::Response { .. } => { CanonicalizeMode::Response { .. } => {
CanonicalVarKind::Region(self.infcx.universe_of_lt(vid).unwrap()) CanonicalVarKind::Region(self.delegate.universe_of_lt(vid).unwrap())
} }
} }
} }
@ -294,7 +292,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I>
var var
}); });
Region::new_anon_bound(self.interner(), self.binder_index, var) Region::new_anon_bound(self.cx(), self.binder_index, var)
} }
fn fold_ty(&mut self, t: I::Ty) -> I::Ty { fn fold_ty(&mut self, t: I::Ty) -> I::Ty {
@ -302,20 +300,20 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I>
ty::Infer(i) => match i { ty::Infer(i) => match i {
ty::TyVar(vid) => { ty::TyVar(vid) => {
assert_eq!( assert_eq!(
self.infcx.opportunistic_resolve_ty_var(vid), self.delegate.opportunistic_resolve_ty_var(vid),
t, t,
"ty vid should have been resolved fully before canonicalization" "ty vid should have been resolved fully before canonicalization"
); );
CanonicalVarKind::Ty(CanonicalTyVarKind::General( CanonicalVarKind::Ty(CanonicalTyVarKind::General(
self.infcx self.delegate
.universe_of_ty(vid) .universe_of_ty(vid)
.unwrap_or_else(|| panic!("ty var should have been resolved: {t:?}")), .unwrap_or_else(|| panic!("ty var should have been resolved: {t:?}")),
)) ))
} }
ty::IntVar(vid) => { ty::IntVar(vid) => {
assert_eq!( assert_eq!(
self.infcx.opportunistic_resolve_int_var(vid), self.delegate.opportunistic_resolve_int_var(vid),
t, t,
"ty vid should have been resolved fully before canonicalization" "ty vid should have been resolved fully before canonicalization"
); );
@ -323,7 +321,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I>
} }
ty::FloatVar(vid) => { ty::FloatVar(vid) => {
assert_eq!( assert_eq!(
self.infcx.opportunistic_resolve_float_var(vid), self.delegate.opportunistic_resolve_float_var(vid),
t, t,
"ty vid should have been resolved fully before canonicalization" "ty vid should have been resolved fully before canonicalization"
); );
@ -383,7 +381,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I>
}), }),
); );
Ty::new_anon_bound(self.interner(), self.binder_index, var) Ty::new_anon_bound(self.cx(), self.binder_index, var)
} }
fn fold_const(&mut self, c: I::Const) -> I::Const { fn fold_const(&mut self, c: I::Const) -> I::Const {
@ -391,11 +389,11 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I>
ty::ConstKind::Infer(i) => match i { ty::ConstKind::Infer(i) => match i {
ty::InferConst::Var(vid) => { ty::InferConst::Var(vid) => {
assert_eq!( assert_eq!(
self.infcx.opportunistic_resolve_ct_var(vid), self.delegate.opportunistic_resolve_ct_var(vid),
c, c,
"const vid should have been resolved fully before canonicalization" "const vid should have been resolved fully before canonicalization"
); );
CanonicalVarKind::Const(self.infcx.universe_of_ct(vid).unwrap()) CanonicalVarKind::Const(self.delegate.universe_of_ct(vid).unwrap())
} }
ty::InferConst::EffectVar(_) => CanonicalVarKind::Effect, ty::InferConst::EffectVar(_) => CanonicalVarKind::Effect,
ty::InferConst::Fresh(_) => todo!(), ty::InferConst::Fresh(_) => todo!(),
@ -431,6 +429,6 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I>
}), }),
); );
Const::new_anon_bound(self.interner(), self.binder_index, var) Const::new_anon_bound(self.cx(), self.binder_index, var)
} }
} }

View File

@ -7,14 +7,14 @@ use rustc_type_ir::{self as ty, Interner};
pub trait SolverDelegate: Sized { pub trait SolverDelegate: Sized {
type Interner: Interner; type Interner: Interner;
fn interner(&self) -> Self::Interner; fn cx(&self) -> Self::Interner;
type Span: Copy; type Span: Copy;
fn solver_mode(&self) -> SolverMode; fn solver_mode(&self) -> SolverMode;
fn build_with_canonical<V>( fn build_with_canonical<V>(
interner: Self::Interner, cx: Self::Interner,
solver_mode: SolverMode, solver_mode: SolverMode,
canonical: &ty::Canonical<Self::Interner, V>, canonical: &ty::Canonical<Self::Interner, V>,
) -> (Self, V, ty::CanonicalVarValues<Self::Interner>) ) -> (Self, V, ty::CanonicalVarValues<Self::Interner>)
@ -102,7 +102,7 @@ pub trait SolverDelegate: Sized {
// FIXME: This is only here because elaboration lives in `rustc_infer`! // FIXME: This is only here because elaboration lives in `rustc_infer`!
fn elaborate_supertraits( fn elaborate_supertraits(
interner: Self::Interner, cx: Self::Interner,
trait_ref: ty::Binder<Self::Interner, ty::TraitRef<Self::Interner>>, trait_ref: ty::Binder<Self::Interner, ty::TraitRef<Self::Interner>>,
) -> impl Iterator<Item = ty::Binder<Self::Interner, ty::TraitRef<Self::Interner>>>; ) -> impl Iterator<Item = ty::Binder<Self::Interner, ty::TraitRef<Self::Interner>>>;

View File

@ -5,6 +5,6 @@
//! So if you got to this crate from the old solver, it's totally normal. //! So if you got to this crate from the old solver, it's totally normal.
pub mod canonicalizer; pub mod canonicalizer;
pub mod infcx; pub mod delegate;
pub mod resolve; pub mod resolve;
pub mod solve; pub mod solve;

View File

@ -1,4 +1,4 @@
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use rustc_type_ir::fold::{TypeFoldable, TypeFolder, TypeSuperFoldable}; use rustc_type_ir::fold::{TypeFoldable, TypeFolder, TypeSuperFoldable};
use rustc_type_ir::inherent::*; use rustc_type_ir::inherent::*;
use rustc_type_ir::visit::TypeVisitableExt; use rustc_type_ir::visit::TypeVisitableExt;
@ -8,37 +8,37 @@ use rustc_type_ir::{self as ty, Interner};
// EAGER RESOLUTION // EAGER RESOLUTION
/// Resolves ty, region, and const vars to their inferred values or their root vars. /// Resolves ty, region, and const vars to their inferred values or their root vars.
pub struct EagerResolver<'a, Infcx, I = <Infcx as SolverDelegate>::Interner> pub struct EagerResolver<'a, D, I = <D as SolverDelegate>::Interner>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
infcx: &'a Infcx, delegate: &'a D,
} }
impl<'a, Infcx: SolverDelegate> EagerResolver<'a, Infcx> { impl<'a, D: SolverDelegate> EagerResolver<'a, D> {
pub fn new(infcx: &'a Infcx) -> Self { pub fn new(delegate: &'a D) -> Self {
EagerResolver { infcx } EagerResolver { delegate }
} }
} }
impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> for EagerResolver<'_, Infcx> { impl<D: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> for EagerResolver<'_, D> {
fn interner(&self) -> I { fn cx(&self) -> I {
self.infcx.interner() self.delegate.cx()
} }
fn fold_ty(&mut self, t: I::Ty) -> I::Ty { fn fold_ty(&mut self, t: I::Ty) -> I::Ty {
match t.kind() { match t.kind() {
ty::Infer(ty::TyVar(vid)) => { ty::Infer(ty::TyVar(vid)) => {
let resolved = self.infcx.opportunistic_resolve_ty_var(vid); let resolved = self.delegate.opportunistic_resolve_ty_var(vid);
if t != resolved && resolved.has_infer() { if t != resolved && resolved.has_infer() {
resolved.fold_with(self) resolved.fold_with(self)
} else { } else {
resolved resolved
} }
} }
ty::Infer(ty::IntVar(vid)) => self.infcx.opportunistic_resolve_int_var(vid), ty::Infer(ty::IntVar(vid)) => self.delegate.opportunistic_resolve_int_var(vid),
ty::Infer(ty::FloatVar(vid)) => self.infcx.opportunistic_resolve_float_var(vid), ty::Infer(ty::FloatVar(vid)) => self.delegate.opportunistic_resolve_float_var(vid),
_ => { _ => {
if t.has_infer() { if t.has_infer() {
t.super_fold_with(self) t.super_fold_with(self)
@ -51,7 +51,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> for EagerRe
fn fold_region(&mut self, r: I::Region) -> I::Region { fn fold_region(&mut self, r: I::Region) -> I::Region {
match r.kind() { match r.kind() {
ty::ReVar(vid) => self.infcx.opportunistic_resolve_lt_var(vid), ty::ReVar(vid) => self.delegate.opportunistic_resolve_lt_var(vid),
_ => r, _ => r,
} }
} }
@ -59,7 +59,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> for EagerRe
fn fold_const(&mut self, c: I::Const) -> I::Const { fn fold_const(&mut self, c: I::Const) -> I::Const {
match c.kind() { match c.kind() {
ty::ConstKind::Infer(ty::InferConst::Var(vid)) => { ty::ConstKind::Infer(ty::InferConst::Var(vid)) => {
let resolved = self.infcx.opportunistic_resolve_ct_var(vid); let resolved = self.delegate.opportunistic_resolve_ct_var(vid);
if c != resolved && resolved.has_infer() { if c != resolved && resolved.has_infer() {
resolved.fold_with(self) resolved.fold_with(self)
} else { } else {
@ -67,7 +67,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> for EagerRe
} }
} }
ty::ConstKind::Infer(ty::InferConst::EffectVar(vid)) => { ty::ConstKind::Infer(ty::InferConst::EffectVar(vid)) => {
self.infcx.opportunistic_resolve_effect_var(vid) self.delegate.opportunistic_resolve_effect_var(vid)
} }
_ => { _ => {
if c.has_infer() { if c.has_infer() {

View File

@ -19,12 +19,12 @@ use rustc_type_ir::inherent::*;
use rustc_type_ir::{self as ty, Interner}; use rustc_type_ir::{self as ty, Interner};
use tracing::{instrument, trace}; use tracing::{instrument, trace};
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::{Certainty, EvalCtxt, Goal, QueryResult}; use crate::solve::{Certainty, EvalCtxt, Goal, QueryResult};
impl<Infcx, I> EvalCtxt<'_, Infcx> impl<D, I> EvalCtxt<'_, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
#[instrument(level = "trace", skip(self), ret)] #[instrument(level = "trace", skip(self), ret)]
@ -32,7 +32,7 @@ where
&mut self, &mut self,
goal: Goal<I, (I::Term, I::Term, ty::AliasRelationDirection)>, goal: Goal<I, (I::Term, I::Term, ty::AliasRelationDirection)>,
) -> QueryResult<I> { ) -> QueryResult<I> {
let tcx = self.interner(); let tcx = self.cx();
let Goal { param_env, predicate: (lhs, rhs, direction) } = goal; let Goal { param_env, predicate: (lhs, rhs, direction) } = goal;
debug_assert!(lhs.to_alias_term().is_some() || rhs.to_alias_term().is_some()); debug_assert!(lhs.to_alias_term().is_some() || rhs.to_alias_term().is_some());

View File

@ -9,7 +9,7 @@ use rustc_type_ir::visit::TypeVisitableExt as _;
use rustc_type_ir::{self as ty, Interner, Upcast as _}; use rustc_type_ir::{self as ty, Interner, Upcast as _};
use tracing::{debug, instrument}; use tracing::{debug, instrument};
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::inspect::ProbeKind; use crate::solve::inspect::ProbeKind;
use crate::solve::{ use crate::solve::{
BuiltinImplSource, CandidateSource, CanonicalResponse, Certainty, EvalCtxt, Goal, GoalSource, BuiltinImplSource, CandidateSource, CanonicalResponse, Certainty, EvalCtxt, Goal, GoalSource,
@ -28,10 +28,10 @@ pub(super) struct Candidate<I: Interner> {
} }
/// Methods used to assemble candidates for either trait or projection goals. /// Methods used to assemble candidates for either trait or projection goals.
pub(super) trait GoalKind<Infcx, I = <Infcx as SolverDelegate>::Interner>: pub(super) trait GoalKind<D, I = <D as SolverDelegate>::Interner>:
TypeFoldable<I> + Copy + Eq + std::fmt::Display TypeFoldable<I> + Copy + Eq + std::fmt::Display
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
fn self_ty(self) -> I::Ty; fn self_ty(self) -> I::Ty;
@ -47,18 +47,18 @@ where
/// work, then produce a response (typically by executing /// work, then produce a response (typically by executing
/// [`EvalCtxt::evaluate_added_goals_and_make_canonical_response`]). /// [`EvalCtxt::evaluate_added_goals_and_make_canonical_response`]).
fn probe_and_match_goal_against_assumption( fn probe_and_match_goal_against_assumption(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
source: CandidateSource<I>, source: CandidateSource<I>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
assumption: I::Clause, assumption: I::Clause,
then: impl FnOnce(&mut EvalCtxt<'_, Infcx>) -> QueryResult<I>, then: impl FnOnce(&mut EvalCtxt<'_, D>) -> QueryResult<I>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
/// Consider a clause, which consists of a "assumption" and some "requirements", /// Consider a clause, which consists of a "assumption" and some "requirements",
/// to satisfy a goal. If the requirements hold, then attempt to satisfy our /// to satisfy a goal. If the requirements hold, then attempt to satisfy our
/// goal by equating it with the assumption. /// goal by equating it with the assumption.
fn probe_and_consider_implied_clause( fn probe_and_consider_implied_clause(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
parent_source: CandidateSource<I>, parent_source: CandidateSource<I>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
assumption: I::Clause, assumption: I::Clause,
@ -76,13 +76,13 @@ where
/// additionally checking all of the supertraits and object bounds to hold, /// additionally checking all of the supertraits and object bounds to hold,
/// since they're not implied by the well-formedness of the object type. /// since they're not implied by the well-formedness of the object type.
fn probe_and_consider_object_bound_candidate( fn probe_and_consider_object_bound_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
source: CandidateSource<I>, source: CandidateSource<I>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
assumption: I::Clause, assumption: I::Clause,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
Self::probe_and_match_goal_against_assumption(ecx, source, goal, assumption, |ecx| { Self::probe_and_match_goal_against_assumption(ecx, source, goal, assumption, |ecx| {
let tcx = ecx.interner(); let tcx = ecx.cx();
let ty::Dynamic(bounds, _, _) = goal.predicate.self_ty().kind() else { let ty::Dynamic(bounds, _, _) = goal.predicate.self_ty().kind() else {
panic!("expected object type in `probe_and_consider_object_bound_candidate`"); panic!("expected object type in `probe_and_consider_object_bound_candidate`");
}; };
@ -100,7 +100,7 @@ where
} }
fn consider_impl_candidate( fn consider_impl_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
impl_def_id: I::DefId, impl_def_id: I::DefId,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
@ -112,7 +112,7 @@ where
/// Trait goals always hold while projection goals never do. This is a bit arbitrary /// Trait goals always hold while projection goals never do. This is a bit arbitrary
/// but prevents incorrect normalization while hiding any trait errors. /// but prevents incorrect normalization while hiding any trait errors.
fn consider_error_guaranteed_candidate( fn consider_error_guaranteed_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
guar: I::ErrorGuaranteed, guar: I::ErrorGuaranteed,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
@ -121,13 +121,13 @@ where
/// These components are given by built-in rules from /// These components are given by built-in rules from
/// [`structural_traits::instantiate_constituent_tys_for_auto_trait`]. /// [`structural_traits::instantiate_constituent_tys_for_auto_trait`].
fn consider_auto_trait_candidate( fn consider_auto_trait_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
/// A trait alias holds if the RHS traits and `where` clauses hold. /// A trait alias holds if the RHS traits and `where` clauses hold.
fn consider_trait_alias_candidate( fn consider_trait_alias_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
@ -136,7 +136,7 @@ where
/// These components are given by built-in rules from /// These components are given by built-in rules from
/// [`structural_traits::instantiate_constituent_tys_for_sized_trait`]. /// [`structural_traits::instantiate_constituent_tys_for_sized_trait`].
fn consider_builtin_sized_candidate( fn consider_builtin_sized_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
@ -145,27 +145,27 @@ where
/// These components are given by built-in rules from /// These components are given by built-in rules from
/// [`structural_traits::instantiate_constituent_tys_for_copy_clone_trait`]. /// [`structural_traits::instantiate_constituent_tys_for_copy_clone_trait`].
fn consider_builtin_copy_clone_candidate( fn consider_builtin_copy_clone_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
/// A type is `PointerLike` if we can compute its layout, and that layout /// A type is `PointerLike` if we can compute its layout, and that layout
/// matches the layout of `usize`. /// matches the layout of `usize`.
fn consider_builtin_pointer_like_candidate( fn consider_builtin_pointer_like_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
/// A type is a `FnPtr` if it is of `FnPtr` type. /// A type is a `FnPtr` if it is of `FnPtr` type.
fn consider_builtin_fn_ptr_trait_candidate( fn consider_builtin_fn_ptr_trait_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
/// A callable type (a closure, fn def, or fn ptr) is known to implement the `Fn<A>` /// A callable type (a closure, fn def, or fn ptr) is known to implement the `Fn<A>`
/// family of traits where `A` is given by the signature of the type. /// family of traits where `A` is given by the signature of the type.
fn consider_builtin_fn_trait_candidates( fn consider_builtin_fn_trait_candidates(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
kind: ty::ClosureKind, kind: ty::ClosureKind,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
@ -173,7 +173,7 @@ where
/// An async closure is known to implement the `AsyncFn<A>` family of traits /// An async closure is known to implement the `AsyncFn<A>` family of traits
/// where `A` is given by the signature of the type. /// where `A` is given by the signature of the type.
fn consider_builtin_async_fn_trait_candidates( fn consider_builtin_async_fn_trait_candidates(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
kind: ty::ClosureKind, kind: ty::ClosureKind,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
@ -182,13 +182,13 @@ where
/// is used internally to delay computation for async closures until after /// is used internally to delay computation for async closures until after
/// upvar analysis is performed in HIR typeck. /// upvar analysis is performed in HIR typeck.
fn consider_builtin_async_fn_kind_helper_candidate( fn consider_builtin_async_fn_kind_helper_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
/// `Tuple` is implemented if the `Self` type is a tuple. /// `Tuple` is implemented if the `Self` type is a tuple.
fn consider_builtin_tuple_candidate( fn consider_builtin_tuple_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
@ -198,7 +198,7 @@ where
/// the built-in types. For structs, the metadata type is given by the struct /// the built-in types. For structs, the metadata type is given by the struct
/// tail. /// tail.
fn consider_builtin_pointee_candidate( fn consider_builtin_pointee_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
@ -206,7 +206,7 @@ where
/// `Future<Output = O>`, where `O` is given by the coroutine's return type /// `Future<Output = O>`, where `O` is given by the coroutine's return type
/// that was computed during type-checking. /// that was computed during type-checking.
fn consider_builtin_future_candidate( fn consider_builtin_future_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
@ -214,19 +214,19 @@ where
/// `Iterator<Item = O>`, where `O` is given by the generator's yield type /// `Iterator<Item = O>`, where `O` is given by the generator's yield type
/// that was computed during type-checking. /// that was computed during type-checking.
fn consider_builtin_iterator_candidate( fn consider_builtin_iterator_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
/// A coroutine (that comes from a `gen` desugaring) is known to implement /// A coroutine (that comes from a `gen` desugaring) is known to implement
/// `FusedIterator` /// `FusedIterator`
fn consider_builtin_fused_iterator_candidate( fn consider_builtin_fused_iterator_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
fn consider_builtin_async_iterator_candidate( fn consider_builtin_async_iterator_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
@ -234,27 +234,27 @@ where
/// implement `Coroutine<R, Yield = Y, Return = O>`, given the resume, yield, /// implement `Coroutine<R, Yield = Y, Return = O>`, given the resume, yield,
/// and return types of the coroutine computed during type-checking. /// and return types of the coroutine computed during type-checking.
fn consider_builtin_coroutine_candidate( fn consider_builtin_coroutine_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
fn consider_builtin_discriminant_kind_candidate( fn consider_builtin_discriminant_kind_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
fn consider_builtin_async_destruct_candidate( fn consider_builtin_async_destruct_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
fn consider_builtin_destruct_candidate( fn consider_builtin_destruct_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
fn consider_builtin_transmute_candidate( fn consider_builtin_transmute_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution>; ) -> Result<Candidate<I>, NoSolution>;
@ -266,17 +266,17 @@ where
/// otherwise recompute this for codegen. This is a bit of a mess but the /// otherwise recompute this for codegen. This is a bit of a mess but the
/// easiest way to maintain the existing behavior for now. /// easiest way to maintain the existing behavior for now.
fn consider_structural_builtin_unsize_candidates( fn consider_structural_builtin_unsize_candidates(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Vec<Candidate<I>>; ) -> Vec<Candidate<I>>;
} }
impl<Infcx, I> EvalCtxt<'_, Infcx> impl<D, I> EvalCtxt<'_, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
pub(super) fn assemble_and_evaluate_candidates<G: GoalKind<Infcx>>( pub(super) fn assemble_and_evaluate_candidates<G: GoalKind<D>>(
&mut self, &mut self,
goal: Goal<I, G>, goal: Goal<I, G>,
) -> Vec<Candidate<I>> { ) -> Vec<Candidate<I>> {
@ -291,10 +291,8 @@ where
return self.forced_ambiguity(MaybeCause::Ambiguity).into_iter().collect(); return self.forced_ambiguity(MaybeCause::Ambiguity).into_iter().collect();
} }
let goal: Goal<I, G> = goal.with( let goal: Goal<I, G> =
self.interner(), goal.with(self.cx(), goal.predicate.with_self_ty(self.cx(), normalized_self_ty));
goal.predicate.with_self_ty(self.interner(), normalized_self_ty),
);
// Vars that show up in the rest of the goal substs may have been constrained by // Vars that show up in the rest of the goal substs may have been constrained by
// normalizing the self type as well, since type variables are not uniquified. // normalizing the self type as well, since type variables are not uniquified.
let goal = self.resolve_vars_if_possible(goal); let goal = self.resolve_vars_if_possible(goal);
@ -337,12 +335,12 @@ where
} }
#[instrument(level = "trace", skip_all)] #[instrument(level = "trace", skip_all)]
fn assemble_impl_candidates<G: GoalKind<Infcx>>( fn assemble_impl_candidates<G: GoalKind<D>>(
&mut self, &mut self,
goal: Goal<I, G>, goal: Goal<I, G>,
candidates: &mut Vec<Candidate<I>>, candidates: &mut Vec<Candidate<I>>,
) { ) {
let tcx = self.interner(); let tcx = self.cx();
tcx.for_each_relevant_impl( tcx.for_each_relevant_impl(
goal.predicate.trait_def_id(tcx), goal.predicate.trait_def_id(tcx),
goal.predicate.self_ty(), goal.predicate.self_ty(),
@ -363,12 +361,12 @@ where
} }
#[instrument(level = "trace", skip_all)] #[instrument(level = "trace", skip_all)]
fn assemble_builtin_impl_candidates<G: GoalKind<Infcx>>( fn assemble_builtin_impl_candidates<G: GoalKind<D>>(
&mut self, &mut self,
goal: Goal<I, G>, goal: Goal<I, G>,
candidates: &mut Vec<Candidate<I>>, candidates: &mut Vec<Candidate<I>>,
) { ) {
let tcx = self.interner(); let tcx = self.cx();
let trait_def_id = goal.predicate.trait_def_id(tcx); let trait_def_id = goal.predicate.trait_def_id(tcx);
// N.B. When assembling built-in candidates for lang items that are also // N.B. When assembling built-in candidates for lang items that are also
@ -394,9 +392,9 @@ where
G::consider_builtin_pointer_like_candidate(self, goal) G::consider_builtin_pointer_like_candidate(self, goal)
} else if tcx.is_lang_item(trait_def_id, TraitSolverLangItem::FnPtrTrait) { } else if tcx.is_lang_item(trait_def_id, TraitSolverLangItem::FnPtrTrait) {
G::consider_builtin_fn_ptr_trait_candidate(self, goal) G::consider_builtin_fn_ptr_trait_candidate(self, goal)
} else if let Some(kind) = self.interner().fn_trait_kind_from_def_id(trait_def_id) { } else if let Some(kind) = self.cx().fn_trait_kind_from_def_id(trait_def_id) {
G::consider_builtin_fn_trait_candidates(self, goal, kind) G::consider_builtin_fn_trait_candidates(self, goal, kind)
} else if let Some(kind) = self.interner().async_fn_trait_kind_from_def_id(trait_def_id) { } else if let Some(kind) = self.cx().async_fn_trait_kind_from_def_id(trait_def_id) {
G::consider_builtin_async_fn_trait_candidates(self, goal, kind) G::consider_builtin_async_fn_trait_candidates(self, goal, kind)
} else if tcx.is_lang_item(trait_def_id, TraitSolverLangItem::AsyncFnKindHelper) { } else if tcx.is_lang_item(trait_def_id, TraitSolverLangItem::AsyncFnKindHelper) {
G::consider_builtin_async_fn_kind_helper_candidate(self, goal) G::consider_builtin_async_fn_kind_helper_candidate(self, goal)
@ -436,7 +434,7 @@ where
} }
#[instrument(level = "trace", skip_all)] #[instrument(level = "trace", skip_all)]
fn assemble_param_env_candidates<G: GoalKind<Infcx>>( fn assemble_param_env_candidates<G: GoalKind<D>>(
&mut self, &mut self,
goal: Goal<I, G>, goal: Goal<I, G>,
candidates: &mut Vec<Candidate<I>>, candidates: &mut Vec<Candidate<I>>,
@ -453,7 +451,7 @@ where
} }
#[instrument(level = "trace", skip_all)] #[instrument(level = "trace", skip_all)]
fn assemble_alias_bound_candidates<G: GoalKind<Infcx>>( fn assemble_alias_bound_candidates<G: GoalKind<D>>(
&mut self, &mut self,
goal: Goal<I, G>, goal: Goal<I, G>,
candidates: &mut Vec<Candidate<I>>, candidates: &mut Vec<Candidate<I>>,
@ -472,7 +470,7 @@ where
/// If so, continue searching by recursively calling after normalization. /// If so, continue searching by recursively calling after normalization.
// FIXME: This may recurse infinitely, but I can't seem to trigger it without // FIXME: This may recurse infinitely, but I can't seem to trigger it without
// hitting another overflow error something. Add a depth parameter needed later. // hitting another overflow error something. Add a depth parameter needed later.
fn assemble_alias_bound_candidates_recur<G: GoalKind<Infcx>>( fn assemble_alias_bound_candidates_recur<G: GoalKind<D>>(
&mut self, &mut self,
self_ty: I::Ty, self_ty: I::Ty,
goal: Goal<I, G>, goal: Goal<I, G>,
@ -523,15 +521,13 @@ where
ty::Alias(kind @ (ty::Projection | ty::Opaque), alias_ty) => (kind, alias_ty), ty::Alias(kind @ (ty::Projection | ty::Opaque), alias_ty) => (kind, alias_ty),
ty::Alias(ty::Inherent | ty::Weak, _) => { ty::Alias(ty::Inherent | ty::Weak, _) => {
self.interner().delay_bug(format!("could not normalize {self_ty:?}, it is not WF")); self.cx().delay_bug(format!("could not normalize {self_ty:?}, it is not WF"));
return; return;
} }
}; };
for assumption in self for assumption in
.interner() self.cx().item_bounds(alias_ty.def_id).iter_instantiated(self.cx(), &alias_ty.args)
.item_bounds(alias_ty.def_id)
.iter_instantiated(self.interner(), &alias_ty.args)
{ {
candidates.extend(G::probe_and_consider_implied_clause( candidates.extend(G::probe_and_consider_implied_clause(
self, self,
@ -556,12 +552,12 @@ where
} }
#[instrument(level = "trace", skip_all)] #[instrument(level = "trace", skip_all)]
fn assemble_object_bound_candidates<G: GoalKind<Infcx>>( fn assemble_object_bound_candidates<G: GoalKind<D>>(
&mut self, &mut self,
goal: Goal<I, G>, goal: Goal<I, G>,
candidates: &mut Vec<Candidate<I>>, candidates: &mut Vec<Candidate<I>>,
) { ) {
let tcx = self.interner(); let tcx = self.cx();
if !tcx.trait_may_be_implemented_via_object(goal.predicate.trait_def_id(tcx)) { if !tcx.trait_may_be_implemented_via_object(goal.predicate.trait_def_id(tcx)) {
return; return;
} }
@ -629,8 +625,7 @@ where
// a projection goal. // a projection goal.
if let Some(principal) = bounds.principal() { if let Some(principal) = bounds.principal() {
let principal_trait_ref = principal.with_self_ty(tcx, self_ty); let principal_trait_ref = principal.with_self_ty(tcx, self_ty);
for (idx, assumption) in for (idx, assumption) in D::elaborate_supertraits(tcx, principal_trait_ref).enumerate()
Infcx::elaborate_supertraits(tcx, principal_trait_ref).enumerate()
{ {
candidates.extend(G::probe_and_consider_object_bound_candidate( candidates.extend(G::probe_and_consider_object_bound_candidate(
self, self,
@ -649,12 +644,12 @@ where
/// To do so we add an ambiguous candidate in case such an unknown impl could /// To do so we add an ambiguous candidate in case such an unknown impl could
/// apply to the current goal. /// apply to the current goal.
#[instrument(level = "trace", skip_all)] #[instrument(level = "trace", skip_all)]
fn assemble_coherence_unknowable_candidates<G: GoalKind<Infcx>>( fn assemble_coherence_unknowable_candidates<G: GoalKind<D>>(
&mut self, &mut self,
goal: Goal<I, G>, goal: Goal<I, G>,
candidates: &mut Vec<Candidate<I>>, candidates: &mut Vec<Candidate<I>>,
) { ) {
let tcx = self.interner(); let tcx = self.cx();
candidates.extend(self.probe_trait_candidate(CandidateSource::CoherenceUnknowable).enter( candidates.extend(self.probe_trait_candidate(CandidateSource::CoherenceUnknowable).enter(
|ecx| { |ecx| {
@ -678,12 +673,12 @@ where
// to improve this however. However, this should make it fairly straightforward to refine // to improve this however. However, this should make it fairly straightforward to refine
// the filtering going forward, so it seems alright-ish for now. // the filtering going forward, so it seems alright-ish for now.
#[instrument(level = "debug", skip(self, goal))] #[instrument(level = "debug", skip(self, goal))]
fn discard_impls_shadowed_by_env<G: GoalKind<Infcx>>( fn discard_impls_shadowed_by_env<G: GoalKind<D>>(
&mut self, &mut self,
goal: Goal<I, G>, goal: Goal<I, G>,
candidates: &mut Vec<Candidate<I>>, candidates: &mut Vec<Candidate<I>>,
) { ) {
let tcx = self.interner(); let tcx = self.cx();
let trait_goal: Goal<I, ty::TraitPredicate<I>> = let trait_goal: Goal<I, ty::TraitPredicate<I>> =
goal.with(tcx, goal.predicate.trait_ref(tcx)); goal.with(tcx, goal.predicate.trait_ref(tcx));

View File

@ -10,20 +10,20 @@ use rustc_type_ir::{self as ty, Interner, Upcast as _};
use rustc_type_ir_macros::{TypeFoldable_Generic, TypeVisitable_Generic}; use rustc_type_ir_macros::{TypeFoldable_Generic, TypeVisitable_Generic};
use tracing::instrument; use tracing::instrument;
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::{EvalCtxt, Goal, NoSolution}; use crate::solve::{EvalCtxt, Goal, NoSolution};
// Calculates the constituent types of a type for `auto trait` purposes. // Calculates the constituent types of a type for `auto trait` purposes.
#[instrument(level = "trace", skip(ecx), ret)] #[instrument(level = "trace", skip(ecx), ret)]
pub(in crate::solve) fn instantiate_constituent_tys_for_auto_trait<Infcx, I>( pub(in crate::solve) fn instantiate_constituent_tys_for_auto_trait<D, I>(
ecx: &EvalCtxt<'_, Infcx>, ecx: &EvalCtxt<'_, D>,
ty: I::Ty, ty: I::Ty,
) -> Result<Vec<ty::Binder<I, I::Ty>>, NoSolution> ) -> Result<Vec<ty::Binder<I, I::Ty>>, NoSolution>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
let tcx = ecx.interner(); let tcx = ecx.cx();
match ty.kind() { match ty.kind() {
ty::Uint(_) ty::Uint(_)
| ty::Int(_) | ty::Int(_)
@ -76,7 +76,7 @@ where
} }
ty::CoroutineWitness(def_id, args) => Ok(ecx ty::CoroutineWitness(def_id, args) => Ok(ecx
.interner() .cx()
.bound_coroutine_hidden_types(def_id) .bound_coroutine_hidden_types(def_id)
.into_iter() .into_iter()
.map(|bty| bty.instantiate(tcx, &args)) .map(|bty| bty.instantiate(tcx, &args))
@ -101,12 +101,12 @@ where
} }
#[instrument(level = "trace", skip(ecx), ret)] #[instrument(level = "trace", skip(ecx), ret)]
pub(in crate::solve) fn instantiate_constituent_tys_for_sized_trait<Infcx, I>( pub(in crate::solve) fn instantiate_constituent_tys_for_sized_trait<D, I>(
ecx: &EvalCtxt<'_, Infcx>, ecx: &EvalCtxt<'_, D>,
ty: I::Ty, ty: I::Ty,
) -> Result<Vec<ty::Binder<I, I::Ty>>, NoSolution> ) -> Result<Vec<ty::Binder<I, I::Ty>>, NoSolution>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
match ty.kind() { match ty.kind() {
@ -159,8 +159,8 @@ where
// "best effort" optimization and `sized_constraint` may return `Some`, even // "best effort" optimization and `sized_constraint` may return `Some`, even
// if the ADT is sized for all possible args. // if the ADT is sized for all possible args.
ty::Adt(def, args) => { ty::Adt(def, args) => {
if let Some(sized_crit) = def.sized_constraint(ecx.interner()) { if let Some(sized_crit) = def.sized_constraint(ecx.cx()) {
Ok(vec![ty::Binder::dummy(sized_crit.instantiate(ecx.interner(), &args))]) Ok(vec![ty::Binder::dummy(sized_crit.instantiate(ecx.cx(), &args))])
} else { } else {
Ok(vec![]) Ok(vec![])
} }
@ -169,12 +169,12 @@ where
} }
#[instrument(level = "trace", skip(ecx), ret)] #[instrument(level = "trace", skip(ecx), ret)]
pub(in crate::solve) fn instantiate_constituent_tys_for_copy_clone_trait<Infcx, I>( pub(in crate::solve) fn instantiate_constituent_tys_for_copy_clone_trait<D, I>(
ecx: &EvalCtxt<'_, Infcx>, ecx: &EvalCtxt<'_, D>,
ty: I::Ty, ty: I::Ty,
) -> Result<Vec<ty::Binder<I, I::Ty>>, NoSolution> ) -> Result<Vec<ty::Binder<I, I::Ty>>, NoSolution>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
match ty.kind() { match ty.kind() {
@ -222,10 +222,10 @@ where
// only when `coroutine_clone` is enabled and the coroutine is movable // only when `coroutine_clone` is enabled and the coroutine is movable
// impl Copy/Clone for Coroutine where T: Copy/Clone forall T in (upvars, witnesses) // impl Copy/Clone for Coroutine where T: Copy/Clone forall T in (upvars, witnesses)
ty::Coroutine(def_id, args) => match ecx.interner().coroutine_movability(def_id) { ty::Coroutine(def_id, args) => match ecx.cx().coroutine_movability(def_id) {
Movability::Static => Err(NoSolution), Movability::Static => Err(NoSolution),
Movability::Movable => { Movability::Movable => {
if ecx.interner().features().coroutine_clone() { if ecx.cx().features().coroutine_clone() {
let coroutine = args.as_coroutine(); let coroutine = args.as_coroutine();
Ok(vec![ Ok(vec![
ty::Binder::dummy(coroutine.tupled_upvars_ty()), ty::Binder::dummy(coroutine.tupled_upvars_ty()),
@ -239,10 +239,10 @@ where
// impl Copy/Clone for CoroutineWitness where T: Copy/Clone forall T in coroutine_hidden_types // impl Copy/Clone for CoroutineWitness where T: Copy/Clone forall T in coroutine_hidden_types
ty::CoroutineWitness(def_id, args) => Ok(ecx ty::CoroutineWitness(def_id, args) => Ok(ecx
.interner() .cx()
.bound_coroutine_hidden_types(def_id) .bound_coroutine_hidden_types(def_id)
.into_iter() .into_iter()
.map(|bty| bty.instantiate(ecx.interner(), &args)) .map(|bty| bty.instantiate(ecx.cx(), &args))
.collect()), .collect()),
} }
} }
@ -656,17 +656,17 @@ fn coroutine_closure_to_ambiguous_coroutine<I: Interner>(
// This is unsound in general and once that is fixed, we don't need to // This is unsound in general and once that is fixed, we don't need to
// normalize eagerly here. See https://github.com/lcnr/solver-woes/issues/9 // normalize eagerly here. See https://github.com/lcnr/solver-woes/issues/9
// for more details. // for more details.
pub(in crate::solve) fn predicates_for_object_candidate<Infcx, I>( pub(in crate::solve) fn predicates_for_object_candidate<D, I>(
ecx: &EvalCtxt<'_, Infcx>, ecx: &EvalCtxt<'_, D>,
param_env: I::ParamEnv, param_env: I::ParamEnv,
trait_ref: ty::TraitRef<I>, trait_ref: ty::TraitRef<I>,
object_bounds: I::BoundExistentialPredicates, object_bounds: I::BoundExistentialPredicates,
) -> Vec<Goal<I, I::Predicate>> ) -> Vec<Goal<I, I::Predicate>>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
let tcx = ecx.interner(); let tcx = ecx.cx();
let mut requirements = vec![]; let mut requirements = vec![];
requirements requirements
.extend(tcx.super_predicates_of(trait_ref.def_id).iter_instantiated(tcx, &trait_ref.args)); .extend(tcx.super_predicates_of(trait_ref.def_id).iter_instantiated(tcx, &trait_ref.args));
@ -712,18 +712,18 @@ where
.collect() .collect()
} }
struct ReplaceProjectionWith<'a, Infcx: SolverDelegate<Interner = I>, I: Interner> { struct ReplaceProjectionWith<'a, D: SolverDelegate<Interner = I>, I: Interner> {
ecx: &'a EvalCtxt<'a, Infcx>, ecx: &'a EvalCtxt<'a, D>,
param_env: I::ParamEnv, param_env: I::ParamEnv,
mapping: HashMap<I::DefId, ty::Binder<I, ty::ProjectionPredicate<I>>>, mapping: HashMap<I::DefId, ty::Binder<I, ty::ProjectionPredicate<I>>>,
nested: Vec<Goal<I, I::Predicate>>, nested: Vec<Goal<I, I::Predicate>>,
} }
impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> impl<D: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I>
for ReplaceProjectionWith<'_, Infcx, I> for ReplaceProjectionWith<'_, D, I>
{ {
fn interner(&self) -> I { fn cx(&self) -> I {
self.ecx.interner() self.ecx.cx()
} }
fn fold_ty(&mut self, ty: I::Ty) -> I::Ty { fn fold_ty(&mut self, ty: I::Ty) -> I::Ty {
@ -739,7 +739,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I>
.eq_and_get_goals( .eq_and_get_goals(
self.param_env, self.param_env,
alias_ty, alias_ty,
proj.projection_term.expect_ty(self.ecx.interner()), proj.projection_term.expect_ty(self.ecx.cx()),
) )
.expect( .expect(
"expected to be able to unify goal projection with dyn's projection", "expected to be able to unify goal projection with dyn's projection",

View File

@ -18,7 +18,7 @@ use rustc_type_ir::{self as ty, Canonical, CanonicalVarValues, Interner};
use tracing::{instrument, trace}; use tracing::{instrument, trace};
use crate::canonicalizer::{CanonicalizeMode, Canonicalizer}; use crate::canonicalizer::{CanonicalizeMode, Canonicalizer};
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::resolve::EagerResolver; use crate::resolve::EagerResolver;
use crate::solve::eval_ctxt::NestedGoals; use crate::solve::eval_ctxt::NestedGoals;
use crate::solve::inspect; use crate::solve::inspect;
@ -44,9 +44,9 @@ impl<I: Interner, T> ResponseT<I> for inspect::State<I, T> {
} }
} }
impl<Infcx, I> EvalCtxt<'_, Infcx> impl<D, I> EvalCtxt<'_, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
/// Canonicalizes the goal remembering the original values /// Canonicalizes the goal remembering the original values
@ -55,19 +55,19 @@ where
&self, &self,
goal: Goal<I, T>, goal: Goal<I, T>,
) -> (Vec<I::GenericArg>, CanonicalInput<I, T>) { ) -> (Vec<I::GenericArg>, CanonicalInput<I, T>) {
let opaque_types = self.infcx.clone_opaque_types_for_query_response(); let opaque_types = self.delegate.clone_opaque_types_for_query_response();
let (goal, opaque_types) = let (goal, opaque_types) =
(goal, opaque_types).fold_with(&mut EagerResolver::new(self.infcx)); (goal, opaque_types).fold_with(&mut EagerResolver::new(self.delegate));
let mut orig_values = Default::default(); let mut orig_values = Default::default();
let canonical_goal = Canonicalizer::canonicalize( let canonical_goal = Canonicalizer::canonicalize(
self.infcx, self.delegate,
CanonicalizeMode::Input, CanonicalizeMode::Input,
&mut orig_values, &mut orig_values,
QueryInput { QueryInput {
goal, goal,
predefined_opaques_in_body: self predefined_opaques_in_body: self
.interner() .cx()
.mk_predefined_opaques_in_body(PredefinedOpaquesData { opaque_types }), .mk_predefined_opaques_in_body(PredefinedOpaquesData { opaque_types }),
}, },
); );
@ -97,7 +97,7 @@ where
// We only check for leaks from universes which were entered inside // We only check for leaks from universes which were entered inside
// of the query. // of the query.
self.infcx.leak_check(self.max_input_universe).map_err(|NoSolution| { self.delegate.leak_check(self.max_input_universe).map_err(|NoSolution| {
trace!("failed the leak check"); trace!("failed the leak check");
NoSolution NoSolution
})?; })?;
@ -125,21 +125,21 @@ where
let external_constraints = let external_constraints =
self.compute_external_query_constraints(certainty, normalization_nested_goals); self.compute_external_query_constraints(certainty, normalization_nested_goals);
let (var_values, mut external_constraints) = let (var_values, mut external_constraints) = (self.var_values, external_constraints)
(self.var_values, external_constraints).fold_with(&mut EagerResolver::new(self.infcx)); .fold_with(&mut EagerResolver::new(self.delegate));
// Remove any trivial region constraints once we've resolved regions // Remove any trivial region constraints once we've resolved regions
external_constraints external_constraints
.region_constraints .region_constraints
.retain(|outlives| outlives.0.as_region().map_or(true, |re| re != outlives.1)); .retain(|outlives| outlives.0.as_region().map_or(true, |re| re != outlives.1));
let canonical = Canonicalizer::canonicalize( let canonical = Canonicalizer::canonicalize(
self.infcx, self.delegate,
CanonicalizeMode::Response { max_input_universe: self.max_input_universe }, CanonicalizeMode::Response { max_input_universe: self.max_input_universe },
&mut Default::default(), &mut Default::default(),
Response { Response {
var_values, var_values,
certainty, certainty,
external_constraints: self.interner().mk_external_constraints(external_constraints), external_constraints: self.cx().mk_external_constraints(external_constraints),
}, },
); );
@ -155,7 +155,7 @@ where
maybe_cause: MaybeCause, maybe_cause: MaybeCause,
) -> CanonicalResponse<I> { ) -> CanonicalResponse<I> {
response_no_constraints_raw( response_no_constraints_raw(
self.interner(), self.cx(),
self.max_input_universe, self.max_input_universe,
self.variables, self.variables,
Certainty::Maybe(maybe_cause), Certainty::Maybe(maybe_cause),
@ -184,7 +184,7 @@ where
// `tests/ui/higher-ranked/leak-check/leak-check-in-selection-5-ambig.rs` and // `tests/ui/higher-ranked/leak-check/leak-check-in-selection-5-ambig.rs` and
// `tests/ui/higher-ranked/leak-check/leak-check-in-selection-6-ambig-unify.rs`. // `tests/ui/higher-ranked/leak-check/leak-check-in-selection-6-ambig-unify.rs`.
let region_constraints = if certainty == Certainty::Yes { let region_constraints = if certainty == Certainty::Yes {
self.infcx.make_deduplicated_outlives_constraints() self.delegate.make_deduplicated_outlives_constraints()
} else { } else {
Default::default() Default::default()
}; };
@ -192,7 +192,7 @@ where
ExternalConstraintsData { ExternalConstraintsData {
region_constraints, region_constraints,
opaque_types: self opaque_types: self
.infcx .delegate
.clone_opaque_types_for_query_response() .clone_opaque_types_for_query_response()
.into_iter() .into_iter()
// Only return *newly defined* opaque types. // Only return *newly defined* opaque types.
@ -219,15 +219,15 @@ where
response: CanonicalResponse<I>, response: CanonicalResponse<I>,
) -> (NestedNormalizationGoals<I>, Certainty) { ) -> (NestedNormalizationGoals<I>, Certainty) {
let instantiation = Self::compute_query_response_instantiation_values( let instantiation = Self::compute_query_response_instantiation_values(
self.infcx, self.delegate,
&original_values, &original_values,
&response, &response,
); );
let Response { var_values, external_constraints, certainty } = let Response { var_values, external_constraints, certainty } =
self.infcx.instantiate_canonical(response, instantiation); self.delegate.instantiate_canonical(response, instantiation);
Self::unify_query_var_values(self.infcx, param_env, &original_values, var_values); Self::unify_query_var_values(self.delegate, param_env, &original_values, var_values);
let ExternalConstraintsData { let ExternalConstraintsData {
region_constraints, region_constraints,
@ -243,17 +243,17 @@ where
/// the canonical response. This depends on the `original_values` for the /// the canonical response. This depends on the `original_values` for the
/// bound variables. /// bound variables.
fn compute_query_response_instantiation_values<T: ResponseT<I>>( fn compute_query_response_instantiation_values<T: ResponseT<I>>(
infcx: &Infcx, delegate: &D,
original_values: &[I::GenericArg], original_values: &[I::GenericArg],
response: &Canonical<I, T>, response: &Canonical<I, T>,
) -> CanonicalVarValues<I> { ) -> CanonicalVarValues<I> {
// FIXME: Longterm canonical queries should deal with all placeholders // FIXME: Longterm canonical queries should deal with all placeholders
// created inside of the query directly instead of returning them to the // created inside of the query directly instead of returning them to the
// caller. // caller.
let prev_universe = infcx.universe(); let prev_universe = delegate.universe();
let universes_created_in_query = response.max_universe.index(); let universes_created_in_query = response.max_universe.index();
for _ in 0..universes_created_in_query { for _ in 0..universes_created_in_query {
infcx.create_next_universe(); delegate.create_next_universe();
} }
let var_values = response.value.var_values(); let var_values = response.value.var_values();
@ -290,13 +290,13 @@ where
} }
} }
let var_values = infcx.interner().mk_args_from_iter( let var_values = delegate.cx().mk_args_from_iter(
response.variables.into_iter().enumerate().map(|(index, info)| { response.variables.into_iter().enumerate().map(|(index, info)| {
if info.universe() != ty::UniverseIndex::ROOT { if info.universe() != ty::UniverseIndex::ROOT {
// A variable from inside a binder of the query. While ideally these shouldn't // A variable from inside a binder of the query. While ideally these shouldn't
// exist at all (see the FIXME at the start of this method), we have to deal with // exist at all (see the FIXME at the start of this method), we have to deal with
// them for now. // them for now.
infcx.instantiate_canonical_var_with_infer(info, |idx| { delegate.instantiate_canonical_var_with_infer(info, |idx| {
ty::UniverseIndex::from(prev_universe.index() + idx.index()) ty::UniverseIndex::from(prev_universe.index() + idx.index())
}) })
} else if info.is_existential() { } else if info.is_existential() {
@ -310,7 +310,7 @@ where
if let Some(v) = opt_values[ty::BoundVar::from_usize(index)] { if let Some(v) = opt_values[ty::BoundVar::from_usize(index)] {
v v
} else { } else {
infcx.instantiate_canonical_var_with_infer(info, |_| prev_universe) delegate.instantiate_canonical_var_with_infer(info, |_| prev_universe)
} }
} else { } else {
// For placeholders which were already part of the input, we simply map this // For placeholders which were already part of the input, we simply map this
@ -335,9 +335,9 @@ where
/// whether an alias is rigid by using the trait solver. When instantiating a response /// whether an alias is rigid by using the trait solver. When instantiating a response
/// from the solver we assume that the solver correctly handled aliases and therefore /// from the solver we assume that the solver correctly handled aliases and therefore
/// always relate them structurally here. /// always relate them structurally here.
#[instrument(level = "trace", skip(infcx))] #[instrument(level = "trace", skip(delegate))]
fn unify_query_var_values( fn unify_query_var_values(
infcx: &Infcx, delegate: &D,
param_env: I::ParamEnv, param_env: I::ParamEnv,
original_values: &[I::GenericArg], original_values: &[I::GenericArg],
var_values: CanonicalVarValues<I>, var_values: CanonicalVarValues<I>,
@ -345,7 +345,8 @@ where
assert_eq!(original_values.len(), var_values.len()); assert_eq!(original_values.len(), var_values.len());
for (&orig, response) in iter::zip(original_values, var_values.var_values) { for (&orig, response) in iter::zip(original_values, var_values.var_values) {
let goals = infcx.eq_structurally_relating_aliases(param_env, orig, response).unwrap(); let goals =
delegate.eq_structurally_relating_aliases(param_env, orig, response).unwrap();
assert!(goals.is_empty()); assert!(goals.is_empty());
} }
} }
@ -365,7 +366,7 @@ where
fn register_new_opaque_types(&mut self, opaque_types: &[(ty::OpaqueTypeKey<I>, I::Ty)]) { fn register_new_opaque_types(&mut self, opaque_types: &[(ty::OpaqueTypeKey<I>, I::Ty)]) {
for &(key, ty) in opaque_types { for &(key, ty) in opaque_types {
self.infcx.inject_new_hidden_type_unchecked(key, ty); self.delegate.inject_new_hidden_type_unchecked(key, ty);
} }
} }
} }
@ -374,22 +375,22 @@ where
/// evaluating a goal. The `var_values` not only include the bound variables /// evaluating a goal. The `var_values` not only include the bound variables
/// of the query input, but also contain all unconstrained inference vars /// of the query input, but also contain all unconstrained inference vars
/// created while evaluating this goal. /// created while evaluating this goal.
pub(in crate::solve) fn make_canonical_state<Infcx, T, I>( pub(in crate::solve) fn make_canonical_state<D, T, I>(
infcx: &Infcx, delegate: &D,
var_values: &[I::GenericArg], var_values: &[I::GenericArg],
max_input_universe: ty::UniverseIndex, max_input_universe: ty::UniverseIndex,
data: T, data: T,
) -> inspect::CanonicalState<I, T> ) -> inspect::CanonicalState<I, T>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
T: TypeFoldable<I>, T: TypeFoldable<I>,
{ {
let var_values = CanonicalVarValues { var_values: infcx.interner().mk_args(var_values) }; let var_values = CanonicalVarValues { var_values: delegate.cx().mk_args(var_values) };
let state = inspect::State { var_values, data }; let state = inspect::State { var_values, data };
let state = state.fold_with(&mut EagerResolver::new(infcx)); let state = state.fold_with(&mut EagerResolver::new(delegate));
Canonicalizer::canonicalize( Canonicalizer::canonicalize(
infcx, delegate,
CanonicalizeMode::Response { max_input_universe }, CanonicalizeMode::Response { max_input_universe },
&mut vec![], &mut vec![],
state, state,
@ -398,15 +399,15 @@ where
// FIXME: needs to be pub to be accessed by downstream // FIXME: needs to be pub to be accessed by downstream
// `rustc_trait_selection::solve::inspect::analyse`. // `rustc_trait_selection::solve::inspect::analyse`.
pub fn instantiate_canonical_state<Infcx, I, T: TypeFoldable<I>>( pub fn instantiate_canonical_state<D, I, T: TypeFoldable<I>>(
infcx: &Infcx, delegate: &D,
span: Infcx::Span, span: D::Span,
param_env: I::ParamEnv, param_env: I::ParamEnv,
orig_values: &mut Vec<I::GenericArg>, orig_values: &mut Vec<I::GenericArg>,
state: inspect::CanonicalState<I, T>, state: inspect::CanonicalState<I, T>,
) -> T ) -> T
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
// In case any fresh inference variables have been created between `state` // In case any fresh inference variables have been created between `state`
@ -415,15 +416,15 @@ where
for &arg in &state.value.var_values.var_values[orig_values.len()..state.value.var_values.len()] for &arg in &state.value.var_values.var_values[orig_values.len()..state.value.var_values.len()]
{ {
// FIXME: This is so ugly. // FIXME: This is so ugly.
let unconstrained = infcx.fresh_var_for_kind_with_span(arg, span); let unconstrained = delegate.fresh_var_for_kind_with_span(arg, span);
orig_values.push(unconstrained); orig_values.push(unconstrained);
} }
let instantiation = let instantiation =
EvalCtxt::compute_query_response_instantiation_values(infcx, orig_values, &state); EvalCtxt::compute_query_response_instantiation_values(delegate, orig_values, &state);
let inspect::State { var_values, data } = infcx.instantiate_canonical(state, instantiation); let inspect::State { var_values, data } = delegate.instantiate_canonical(state, instantiation);
EvalCtxt::unify_query_var_values(infcx, param_env, orig_values, var_values); EvalCtxt::unify_query_var_values(delegate, param_env, orig_values, var_values);
data data
} }

View File

@ -11,7 +11,7 @@ use rustc_type_ir::{self as ty, CanonicalVarValues, Interner};
use rustc_type_ir_macros::{Lift_Generic, TypeFoldable_Generic, TypeVisitable_Generic}; use rustc_type_ir_macros::{Lift_Generic, TypeFoldable_Generic, TypeVisitable_Generic};
use tracing::{instrument, trace}; use tracing::{instrument, trace};
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::inspect::{self, ProofTreeBuilder}; use crate::solve::inspect::{self, ProofTreeBuilder};
use crate::solve::search_graph::SearchGraph; use crate::solve::search_graph::SearchGraph;
use crate::solve::{ use crate::solve::{
@ -23,9 +23,9 @@ use crate::solve::{
pub(super) mod canonical; pub(super) mod canonical;
mod probe; mod probe;
pub struct EvalCtxt<'a, Infcx, I = <Infcx as SolverDelegate>::Interner> pub struct EvalCtxt<'a, D, I = <D as SolverDelegate>::Interner>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
/// The inference context that backs (mostly) inference and placeholder terms /// The inference context that backs (mostly) inference and placeholder terms
@ -43,7 +43,7 @@ where
/// If some `InferCtxt` method is missing, please first think defensively about /// If some `InferCtxt` method is missing, please first think defensively about
/// the method's compatibility with this solver, or if an existing one does /// the method's compatibility with this solver, or if an existing one does
/// the job already. /// the job already.
infcx: &'a Infcx, delegate: &'a D,
/// The variable info for the `var_values`, only used to make an ambiguous response /// The variable info for the `var_values`, only used to make an ambiguous response
/// with no constraints. /// with no constraints.
@ -83,7 +83,7 @@ where
// evaluation code. // evaluation code.
tainted: Result<(), NoSolution>, tainted: Result<(), NoSolution>,
pub(super) inspect: ProofTreeBuilder<Infcx>, pub(super) inspect: ProofTreeBuilder<D>,
} }
#[derive(derivative::Derivative)] #[derive(derivative::Derivative)]
@ -143,9 +143,9 @@ pub trait SolverDelegateEvalExt: SolverDelegate {
); );
} }
impl<Infcx, I> SolverDelegateEvalExt for Infcx impl<D, I> SolverDelegateEvalExt for D
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
/// Evaluates a goal from **outside** of the trait solver. /// Evaluates a goal from **outside** of the trait solver.
@ -178,9 +178,9 @@ where
} }
} }
impl<'a, Infcx, I> EvalCtxt<'a, Infcx> impl<'a, D, I> EvalCtxt<'a, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
pub(super) fn solver_mode(&self) -> SolverMode { pub(super) fn solver_mode(&self) -> SolverMode {
@ -195,22 +195,22 @@ where
/// used from outside of any evaluation, and other methods should be preferred /// used from outside of any evaluation, and other methods should be preferred
/// over using this manually (such as [`SolverDelegateEvalExt::evaluate_root_goal`]). /// over using this manually (such as [`SolverDelegateEvalExt::evaluate_root_goal`]).
pub(super) fn enter_root<R>( pub(super) fn enter_root<R>(
infcx: &Infcx, delegate: &D,
generate_proof_tree: GenerateProofTree, generate_proof_tree: GenerateProofTree,
f: impl FnOnce(&mut EvalCtxt<'_, Infcx>) -> R, f: impl FnOnce(&mut EvalCtxt<'_, D>) -> R,
) -> (R, Option<inspect::GoalEvaluation<I>>) { ) -> (R, Option<inspect::GoalEvaluation<I>>) {
let mut search_graph = search_graph::SearchGraph::new(infcx.solver_mode()); let mut search_graph = search_graph::SearchGraph::new(delegate.solver_mode());
let mut ecx = EvalCtxt { let mut ecx = EvalCtxt {
infcx, delegate,
search_graph: &mut search_graph, search_graph: &mut search_graph,
nested_goals: NestedGoals::new(), nested_goals: NestedGoals::new(),
inspect: ProofTreeBuilder::new_maybe_root(generate_proof_tree), inspect: ProofTreeBuilder::new_maybe_root(generate_proof_tree),
// Only relevant when canonicalizing the response, // Only relevant when canonicalizing the response,
// which we don't do within this evaluation context. // which we don't do within this evaluation context.
predefined_opaques_in_body: infcx predefined_opaques_in_body: delegate
.interner() .cx()
.mk_predefined_opaques_in_body(PredefinedOpaquesData::default()), .mk_predefined_opaques_in_body(PredefinedOpaquesData::default()),
max_input_universe: ty::UniverseIndex::ROOT, max_input_universe: ty::UniverseIndex::ROOT,
variables: Default::default(), variables: Default::default(),
@ -242,14 +242,14 @@ where
tcx: I, tcx: I,
search_graph: &'a mut search_graph::SearchGraph<I>, search_graph: &'a mut search_graph::SearchGraph<I>,
canonical_input: CanonicalInput<I>, canonical_input: CanonicalInput<I>,
canonical_goal_evaluation: &mut ProofTreeBuilder<Infcx>, canonical_goal_evaluation: &mut ProofTreeBuilder<D>,
f: impl FnOnce(&mut EvalCtxt<'_, Infcx>, Goal<I, I::Predicate>) -> R, f: impl FnOnce(&mut EvalCtxt<'_, D>, Goal<I, I::Predicate>) -> R,
) -> R { ) -> R {
let (ref infcx, input, var_values) = let (ref delegate, input, var_values) =
SolverDelegate::build_with_canonical(tcx, search_graph.solver_mode(), &canonical_input); SolverDelegate::build_with_canonical(tcx, search_graph.solver_mode(), &canonical_input);
let mut ecx = EvalCtxt { let mut ecx = EvalCtxt {
infcx, delegate,
variables: canonical_input.variables, variables: canonical_input.variables,
var_values, var_values,
is_normalizes_to_goal: false, is_normalizes_to_goal: false,
@ -262,7 +262,7 @@ where
}; };
for &(key, ty) in &input.predefined_opaques_in_body.opaque_types { for &(key, ty) in &input.predefined_opaques_in_body.opaque_types {
ecx.infcx.inject_new_hidden_type_unchecked(key, ty); ecx.delegate.inject_new_hidden_type_unchecked(key, ty);
} }
if !ecx.nested_goals.is_empty() { if !ecx.nested_goals.is_empty() {
@ -270,7 +270,7 @@ where
} }
let result = f(&mut ecx, input.goal); let result = f(&mut ecx, input.goal);
ecx.inspect.probe_final_state(ecx.infcx, ecx.max_input_universe); ecx.inspect.probe_final_state(ecx.delegate, ecx.max_input_universe);
canonical_goal_evaluation.goal_evaluation_step(ecx.inspect); canonical_goal_evaluation.goal_evaluation_step(ecx.inspect);
// When creating a query response we clone the opaque type constraints // When creating a query response we clone the opaque type constraints
@ -278,7 +278,7 @@ where
// assertions against dropping an `InferCtxt` without taking opaques. // assertions against dropping an `InferCtxt` without taking opaques.
// FIXME: Once we remove support for the old impl we can remove this. // FIXME: Once we remove support for the old impl we can remove this.
// FIXME: Could we make `build_with_canonical` into `enter_with_canonical` and call this at the end? // FIXME: Could we make `build_with_canonical` into `enter_with_canonical` and call this at the end?
infcx.reset_opaque_types(); delegate.reset_opaque_types();
result result
} }
@ -297,7 +297,7 @@ where
tcx: I, tcx: I,
search_graph: &'a mut search_graph::SearchGraph<I>, search_graph: &'a mut search_graph::SearchGraph<I>,
canonical_input: CanonicalInput<I>, canonical_input: CanonicalInput<I>,
goal_evaluation: &mut ProofTreeBuilder<Infcx>, goal_evaluation: &mut ProofTreeBuilder<D>,
) -> QueryResult<I> { ) -> QueryResult<I> {
let mut canonical_goal_evaluation = let mut canonical_goal_evaluation =
goal_evaluation.new_canonical_goal_evaluation(canonical_input); goal_evaluation.new_canonical_goal_evaluation(canonical_input);
@ -364,7 +364,7 @@ where
let mut goal_evaluation = let mut goal_evaluation =
self.inspect.new_goal_evaluation(goal, &orig_values, goal_evaluation_kind); self.inspect.new_goal_evaluation(goal, &orig_values, goal_evaluation_kind);
let canonical_response = EvalCtxt::evaluate_canonical_goal( let canonical_response = EvalCtxt::evaluate_canonical_goal(
self.interner(), self.cx(),
self.search_graph, self.search_graph,
canonical_goal, canonical_goal,
&mut goal_evaluation, &mut goal_evaluation,
@ -466,8 +466,8 @@ where
} }
} }
} else { } else {
self.infcx.enter_forall(kind, |kind| { self.delegate.enter_forall(kind, |kind| {
let goal = goal.with(self.interner(), ty::Binder::dummy(kind)); let goal = goal.with(self.cx(), ty::Binder::dummy(kind));
self.add_goal(GoalSource::InstantiateHigherRanked, goal); self.add_goal(GoalSource::InstantiateHigherRanked, goal);
self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes) self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes)
}) })
@ -506,7 +506,7 @@ where
/// ///
/// Goals for the next step get directly added to the nested goals of the `EvalCtxt`. /// Goals for the next step get directly added to the nested goals of the `EvalCtxt`.
fn evaluate_added_goals_step(&mut self) -> Result<Option<Certainty>, NoSolution> { fn evaluate_added_goals_step(&mut self) -> Result<Option<Certainty>, NoSolution> {
let tcx = self.interner(); let tcx = self.cx();
let mut goals = core::mem::take(&mut self.nested_goals); let mut goals = core::mem::take(&mut self.nested_goals);
// If this loop did not result in any progress, what's our final certainty. // If this loop did not result in any progress, what's our final certainty.
@ -588,11 +588,11 @@ where
/// Record impl args in the proof tree for later access by `InspectCandidate`. /// Record impl args in the proof tree for later access by `InspectCandidate`.
pub(crate) fn record_impl_args(&mut self, impl_args: I::GenericArgs) { pub(crate) fn record_impl_args(&mut self, impl_args: I::GenericArgs) {
self.inspect.record_impl_args(self.infcx, self.max_input_universe, impl_args) self.inspect.record_impl_args(self.delegate, self.max_input_universe, impl_args)
} }
pub(super) fn interner(&self) -> I { pub(super) fn cx(&self) -> I {
self.infcx.interner() self.delegate.cx()
} }
#[instrument(level = "trace", skip(self))] #[instrument(level = "trace", skip(self))]
@ -600,7 +600,7 @@ where
goal.predicate = goal goal.predicate = goal
.predicate .predicate
.fold_with(&mut ReplaceAliasWithInfer { ecx: self, param_env: goal.param_env }); .fold_with(&mut ReplaceAliasWithInfer { ecx: self, param_env: goal.param_env });
self.inspect.add_normalizes_to_goal(self.infcx, self.max_input_universe, goal); self.inspect.add_normalizes_to_goal(self.delegate, self.max_input_universe, goal);
self.nested_goals.normalizes_to_goals.push(goal); self.nested_goals.normalizes_to_goals.push(goal);
} }
@ -609,7 +609,7 @@ where
goal.predicate = goal goal.predicate = goal
.predicate .predicate
.fold_with(&mut ReplaceAliasWithInfer { ecx: self, param_env: goal.param_env }); .fold_with(&mut ReplaceAliasWithInfer { ecx: self, param_env: goal.param_env });
self.inspect.add_goal(self.infcx, self.max_input_universe, source, goal); self.inspect.add_goal(self.delegate, self.max_input_universe, source, goal);
self.nested_goals.goals.push((source, goal)); self.nested_goals.goals.push((source, goal));
} }
@ -625,13 +625,13 @@ where
} }
pub(super) fn next_ty_infer(&mut self) -> I::Ty { pub(super) fn next_ty_infer(&mut self) -> I::Ty {
let ty = self.infcx.next_ty_infer(); let ty = self.delegate.next_ty_infer();
self.inspect.add_var_value(ty); self.inspect.add_var_value(ty);
ty ty
} }
pub(super) fn next_const_infer(&mut self) -> I::Const { pub(super) fn next_const_infer(&mut self) -> I::Const {
let ct = self.infcx.next_const_infer(); let ct = self.delegate.next_const_infer();
self.inspect.add_var_value(ct); self.inspect.add_var_value(ct);
ct ct
} }
@ -654,27 +654,27 @@ where
let universe_of_term = match goal.predicate.term.kind() { let universe_of_term = match goal.predicate.term.kind() {
ty::TermKind::Ty(ty) => { ty::TermKind::Ty(ty) => {
if let ty::Infer(ty::TyVar(vid)) = ty.kind() { if let ty::Infer(ty::TyVar(vid)) = ty.kind() {
self.infcx.universe_of_ty(vid).unwrap() self.delegate.universe_of_ty(vid).unwrap()
} else { } else {
return false; return false;
} }
} }
ty::TermKind::Const(ct) => { ty::TermKind::Const(ct) => {
if let ty::ConstKind::Infer(ty::InferConst::Var(vid)) = ct.kind() { if let ty::ConstKind::Infer(ty::InferConst::Var(vid)) = ct.kind() {
self.infcx.universe_of_ct(vid).unwrap() self.delegate.universe_of_ct(vid).unwrap()
} else { } else {
return false; return false;
} }
} }
}; };
struct ContainsTermOrNotNameable<'a, Infcx: SolverDelegate<Interner = I>, I: Interner> { struct ContainsTermOrNotNameable<'a, D: SolverDelegate<Interner = I>, I: Interner> {
term: I::Term, term: I::Term,
universe_of_term: ty::UniverseIndex, universe_of_term: ty::UniverseIndex,
infcx: &'a Infcx, delegate: &'a D,
} }
impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ContainsTermOrNotNameable<'_, Infcx, I> { impl<D: SolverDelegate<Interner = I>, I: Interner> ContainsTermOrNotNameable<'_, D, I> {
fn check_nameable(&self, universe: ty::UniverseIndex) -> ControlFlow<()> { fn check_nameable(&self, universe: ty::UniverseIndex) -> ControlFlow<()> {
if self.universe_of_term.can_name(universe) { if self.universe_of_term.can_name(universe) {
ControlFlow::Continue(()) ControlFlow::Continue(())
@ -684,8 +684,8 @@ where
} }
} }
impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeVisitor<I> impl<D: SolverDelegate<Interner = I>, I: Interner> TypeVisitor<I>
for ContainsTermOrNotNameable<'_, Infcx, I> for ContainsTermOrNotNameable<'_, D, I>
{ {
type Result = ControlFlow<()>; type Result = ControlFlow<()>;
fn visit_ty(&mut self, t: I::Ty) -> Self::Result { fn visit_ty(&mut self, t: I::Ty) -> Self::Result {
@ -693,13 +693,15 @@ where
ty::Infer(ty::TyVar(vid)) => { ty::Infer(ty::TyVar(vid)) => {
if let ty::TermKind::Ty(term) = self.term.kind() { if let ty::TermKind::Ty(term) = self.term.kind() {
if let ty::Infer(ty::TyVar(term_vid)) = term.kind() { if let ty::Infer(ty::TyVar(term_vid)) = term.kind() {
if self.infcx.root_ty_var(vid) == self.infcx.root_ty_var(term_vid) { if self.delegate.root_ty_var(vid)
== self.delegate.root_ty_var(term_vid)
{
return ControlFlow::Break(()); return ControlFlow::Break(());
} }
} }
} }
self.check_nameable(self.infcx.universe_of_ty(vid).unwrap()) self.check_nameable(self.delegate.universe_of_ty(vid).unwrap())
} }
ty::Placeholder(p) => self.check_nameable(p.universe()), ty::Placeholder(p) => self.check_nameable(p.universe()),
_ => { _ => {
@ -718,15 +720,15 @@ where
if let ty::TermKind::Const(term) = self.term.kind() { if let ty::TermKind::Const(term) = self.term.kind() {
if let ty::ConstKind::Infer(ty::InferConst::Var(term_vid)) = term.kind() if let ty::ConstKind::Infer(ty::InferConst::Var(term_vid)) = term.kind()
{ {
if self.infcx.root_const_var(vid) if self.delegate.root_const_var(vid)
== self.infcx.root_const_var(term_vid) == self.delegate.root_const_var(term_vid)
{ {
return ControlFlow::Break(()); return ControlFlow::Break(());
} }
} }
} }
self.check_nameable(self.infcx.universe_of_ct(vid).unwrap()) self.check_nameable(self.delegate.universe_of_ct(vid).unwrap())
} }
ty::ConstKind::Placeholder(p) => self.check_nameable(p.universe()), ty::ConstKind::Placeholder(p) => self.check_nameable(p.universe()),
_ => { _ => {
@ -741,7 +743,7 @@ where
} }
let mut visitor = ContainsTermOrNotNameable { let mut visitor = ContainsTermOrNotNameable {
infcx: self.infcx, delegate: self.delegate,
universe_of_term, universe_of_term,
term: goal.predicate.term, term: goal.predicate.term,
}; };
@ -775,7 +777,7 @@ where
// NOTE: this check is purely an optimization, the structural eq would // NOTE: this check is purely an optimization, the structural eq would
// always fail if the term is not an inference variable. // always fail if the term is not an inference variable.
if term.is_infer() { if term.is_infer() {
let tcx = self.interner(); let tcx = self.cx();
// We need to relate `alias` to `term` treating only the outermost // We need to relate `alias` to `term` treating only the outermost
// constructor as rigid, relating any contained generic arguments as // constructor as rigid, relating any contained generic arguments as
// normal. We do this by first structurally equating the `term` // normal. We do this by first structurally equating the `term`
@ -788,7 +790,7 @@ where
let rigid_ctor = ty::AliasTerm::new(tcx, alias.def_id, identity_args); let rigid_ctor = ty::AliasTerm::new(tcx, alias.def_id, identity_args);
let ctor_term = rigid_ctor.to_term(tcx); let ctor_term = rigid_ctor.to_term(tcx);
let obligations = let obligations =
self.infcx.eq_structurally_relating_aliases(param_env, term, ctor_term)?; self.delegate.eq_structurally_relating_aliases(param_env, term, ctor_term)?;
debug_assert!(obligations.is_empty()); debug_assert!(obligations.is_empty());
self.relate(param_env, alias, variance, rigid_ctor) self.relate(param_env, alias, variance, rigid_ctor)
} else { } else {
@ -806,7 +808,7 @@ where
lhs: T, lhs: T,
rhs: T, rhs: T,
) -> Result<(), NoSolution> { ) -> Result<(), NoSolution> {
let result = self.infcx.eq_structurally_relating_aliases(param_env, lhs, rhs)?; let result = self.delegate.eq_structurally_relating_aliases(param_env, lhs, rhs)?;
assert_eq!(result, vec![]); assert_eq!(result, vec![]);
Ok(()) Ok(())
} }
@ -829,7 +831,7 @@ where
variance: ty::Variance, variance: ty::Variance,
rhs: T, rhs: T,
) -> Result<(), NoSolution> { ) -> Result<(), NoSolution> {
let goals = self.infcx.relate(param_env, lhs, variance, rhs)?; let goals = self.delegate.relate(param_env, lhs, variance, rhs)?;
self.add_goals(GoalSource::Misc, goals); self.add_goals(GoalSource::Misc, goals);
Ok(()) Ok(())
} }
@ -846,14 +848,14 @@ where
lhs: T, lhs: T,
rhs: T, rhs: T,
) -> Result<Vec<Goal<I, I::Predicate>>, NoSolution> { ) -> Result<Vec<Goal<I, I::Predicate>>, NoSolution> {
self.infcx.relate(param_env, lhs, ty::Variance::Invariant, rhs) self.delegate.relate(param_env, lhs, ty::Variance::Invariant, rhs)
} }
pub(super) fn instantiate_binder_with_infer<T: TypeFoldable<I> + Copy>( pub(super) fn instantiate_binder_with_infer<T: TypeFoldable<I> + Copy>(
&self, &self,
value: ty::Binder<I, T>, value: ty::Binder<I, T>,
) -> T { ) -> T {
self.infcx.instantiate_binder_with_infer(value) self.delegate.instantiate_binder_with_infer(value)
} }
pub(super) fn enter_forall<T: TypeFoldable<I> + Copy, U>( pub(super) fn enter_forall<T: TypeFoldable<I> + Copy, U>(
@ -861,18 +863,18 @@ where
value: ty::Binder<I, T>, value: ty::Binder<I, T>,
f: impl FnOnce(T) -> U, f: impl FnOnce(T) -> U,
) -> U { ) -> U {
self.infcx.enter_forall(value, f) self.delegate.enter_forall(value, f)
} }
pub(super) fn resolve_vars_if_possible<T>(&self, value: T) -> T pub(super) fn resolve_vars_if_possible<T>(&self, value: T) -> T
where where
T: TypeFoldable<I>, T: TypeFoldable<I>,
{ {
self.infcx.resolve_vars_if_possible(value) self.delegate.resolve_vars_if_possible(value)
} }
pub(super) fn fresh_args_for_item(&mut self, def_id: I::DefId) -> I::GenericArgs { pub(super) fn fresh_args_for_item(&mut self, def_id: I::DefId) -> I::GenericArgs {
let args = self.infcx.fresh_args_for_item(def_id); let args = self.delegate.fresh_args_for_item(def_id);
for arg in args { for arg in args {
self.inspect.add_var_value(arg); self.inspect.add_var_value(arg);
} }
@ -880,12 +882,12 @@ where
} }
pub(super) fn register_ty_outlives(&self, ty: I::Ty, lt: I::Region) { pub(super) fn register_ty_outlives(&self, ty: I::Ty, lt: I::Region) {
self.infcx.register_ty_outlives(ty, lt); self.delegate.register_ty_outlives(ty, lt);
} }
pub(super) fn register_region_outlives(&self, a: I::Region, b: I::Region) { pub(super) fn register_region_outlives(&self, a: I::Region, b: I::Region) {
// `b : a` ==> `a <= b` // `b : a` ==> `a <= b`
self.infcx.sub_regions(b, a); self.delegate.sub_regions(b, a);
} }
/// Computes the list of goals required for `arg` to be well-formed /// Computes the list of goals required for `arg` to be well-formed
@ -894,7 +896,7 @@ where
param_env: I::ParamEnv, param_env: I::ParamEnv,
arg: I::GenericArg, arg: I::GenericArg,
) -> Option<Vec<Goal<I, I::Predicate>>> { ) -> Option<Vec<Goal<I, I::Predicate>>> {
self.infcx.well_formed_goals(param_env, arg) self.delegate.well_formed_goals(param_env, arg)
} }
pub(super) fn trait_ref_is_knowable( pub(super) fn trait_ref_is_knowable(
@ -902,9 +904,9 @@ where
param_env: I::ParamEnv, param_env: I::ParamEnv,
trait_ref: ty::TraitRef<I>, trait_ref: ty::TraitRef<I>,
) -> Result<bool, NoSolution> { ) -> Result<bool, NoSolution> {
let infcx = self.infcx; let delegate = self.delegate;
let lazily_normalize_ty = |ty| self.structurally_normalize_ty(param_env, ty); let lazily_normalize_ty = |ty| self.structurally_normalize_ty(param_env, ty);
infcx.trait_ref_is_knowable(trait_ref, lazily_normalize_ty) delegate.trait_ref_is_knowable(trait_ref, lazily_normalize_ty)
} }
pub(super) fn fetch_eligible_assoc_item( pub(super) fn fetch_eligible_assoc_item(
@ -914,7 +916,7 @@ where
trait_assoc_def_id: I::DefId, trait_assoc_def_id: I::DefId,
impl_def_id: I::DefId, impl_def_id: I::DefId,
) -> Result<Option<I::DefId>, NoSolution> { ) -> Result<Option<I::DefId>, NoSolution> {
self.infcx.fetch_eligible_assoc_item( self.delegate.fetch_eligible_assoc_item(
param_env, param_env,
goal_trait_ref, goal_trait_ref,
trait_assoc_def_id, trait_assoc_def_id,
@ -923,7 +925,7 @@ where
} }
pub(super) fn can_define_opaque_ty(&self, def_id: I::LocalDefId) -> bool { pub(super) fn can_define_opaque_ty(&self, def_id: I::LocalDefId) -> bool {
self.infcx.defining_opaque_types().contains(&def_id) self.delegate.defining_opaque_types().contains(&def_id)
} }
pub(super) fn insert_hidden_type( pub(super) fn insert_hidden_type(
@ -933,7 +935,7 @@ where
hidden_ty: I::Ty, hidden_ty: I::Ty,
) -> Result<(), NoSolution> { ) -> Result<(), NoSolution> {
let mut goals = Vec::new(); let mut goals = Vec::new();
self.infcx.insert_hidden_type(opaque_type_key, param_env, hidden_ty, &mut goals)?; self.delegate.insert_hidden_type(opaque_type_key, param_env, hidden_ty, &mut goals)?;
self.add_goals(GoalSource::Misc, goals); self.add_goals(GoalSource::Misc, goals);
Ok(()) Ok(())
} }
@ -946,7 +948,7 @@ where
hidden_ty: I::Ty, hidden_ty: I::Ty,
) { ) {
let mut goals = Vec::new(); let mut goals = Vec::new();
self.infcx.add_item_bounds_for_hidden_type( self.delegate.add_item_bounds_for_hidden_type(
opaque_def_id, opaque_def_id,
opaque_args, opaque_args,
param_env, param_env,
@ -965,7 +967,7 @@ where
ty: I::Ty, ty: I::Ty,
) -> Vec<CanonicalResponse<I>> { ) -> Vec<CanonicalResponse<I>> {
// FIXME: Super inefficient to be cloning this... // FIXME: Super inefficient to be cloning this...
let opaques = self.infcx.clone_opaque_types_for_query_response(); let opaques = self.delegate.clone_opaque_types_for_query_response();
let mut values = vec![]; let mut values = vec![];
for (candidate_key, candidate_ty) in opaques { for (candidate_key, candidate_ty) in opaques {
@ -1002,7 +1004,7 @@ where
param_env: I::ParamEnv, param_env: I::ParamEnv,
unevaluated: ty::UnevaluatedConst<I>, unevaluated: ty::UnevaluatedConst<I>,
) -> Option<I::Const> { ) -> Option<I::Const> {
self.infcx.try_const_eval_resolve(param_env, unevaluated) self.delegate.try_const_eval_resolve(param_env, unevaluated)
} }
pub(super) fn is_transmutable( pub(super) fn is_transmutable(
@ -1012,7 +1014,7 @@ where
src: I::Ty, src: I::Ty,
assume: I::Const, assume: I::Const,
) -> Result<Certainty, NoSolution> { ) -> Result<Certainty, NoSolution> {
self.infcx.is_transmutable(param_env, dst, src, assume) self.delegate.is_transmutable(param_env, dst, src, assume)
} }
} }
@ -1023,22 +1025,22 @@ where
/// ///
/// This is a performance optimization to more eagerly detect cycles during trait /// This is a performance optimization to more eagerly detect cycles during trait
/// solving. See tests/ui/traits/next-solver/cycles/cycle-modulo-ambig-aliases.rs. /// solving. See tests/ui/traits/next-solver/cycles/cycle-modulo-ambig-aliases.rs.
struct ReplaceAliasWithInfer<'me, 'a, Infcx, I> struct ReplaceAliasWithInfer<'me, 'a, D, I>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
ecx: &'me mut EvalCtxt<'a, Infcx>, ecx: &'me mut EvalCtxt<'a, D>,
param_env: I::ParamEnv, param_env: I::ParamEnv,
} }
impl<Infcx, I> TypeFolder<I> for ReplaceAliasWithInfer<'_, '_, Infcx, I> impl<D, I> TypeFolder<I> for ReplaceAliasWithInfer<'_, '_, D, I>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
fn interner(&self) -> I { fn cx(&self) -> I {
self.ecx.interner() self.ecx.cx()
} }
fn fold_ty(&mut self, ty: I::Ty) -> I::Ty { fn fold_ty(&mut self, ty: I::Ty) -> I::Ty {
@ -1052,7 +1054,7 @@ where
); );
self.ecx.add_goal( self.ecx.add_goal(
GoalSource::Misc, GoalSource::Misc,
Goal::new(self.interner(), self.param_env, normalizes_to), Goal::new(self.cx(), self.param_env, normalizes_to),
); );
infer_ty infer_ty
} }
@ -1071,7 +1073,7 @@ where
); );
self.ecx.add_goal( self.ecx.add_goal(
GoalSource::Misc, GoalSource::Misc,
Goal::new(self.interner(), self.param_env, normalizes_to), Goal::new(self.cx(), self.param_env, normalizes_to),
); );
infer_ct infer_ct
} }

View File

@ -3,34 +3,34 @@ use std::marker::PhantomData;
use rustc_type_ir::Interner; use rustc_type_ir::Interner;
use tracing::instrument; use tracing::instrument;
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::assembly::Candidate; use crate::solve::assembly::Candidate;
use crate::solve::inspect; use crate::solve::inspect;
use crate::solve::{BuiltinImplSource, CandidateSource, EvalCtxt, NoSolution, QueryResult}; use crate::solve::{BuiltinImplSource, CandidateSource, EvalCtxt, NoSolution, QueryResult};
pub(in crate::solve) struct ProbeCtxt<'me, 'a, Infcx, I, F, T> pub(in crate::solve) struct ProbeCtxt<'me, 'a, D, I, F, T>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
ecx: &'me mut EvalCtxt<'a, Infcx, I>, ecx: &'me mut EvalCtxt<'a, D, I>,
probe_kind: F, probe_kind: F,
_result: PhantomData<T>, _result: PhantomData<T>,
} }
impl<Infcx, I, F, T> ProbeCtxt<'_, '_, Infcx, I, F, T> impl<D, I, F, T> ProbeCtxt<'_, '_, D, I, F, T>
where where
F: FnOnce(&T) -> inspect::ProbeKind<I>, F: FnOnce(&T) -> inspect::ProbeKind<I>,
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
pub(in crate::solve) fn enter(self, f: impl FnOnce(&mut EvalCtxt<'_, Infcx>) -> T) -> T { pub(in crate::solve) fn enter(self, f: impl FnOnce(&mut EvalCtxt<'_, D>) -> T) -> T {
let ProbeCtxt { ecx: outer_ecx, probe_kind, _result } = self; let ProbeCtxt { ecx: outer_ecx, probe_kind, _result } = self;
let infcx = outer_ecx.infcx; let delegate = outer_ecx.delegate;
let max_input_universe = outer_ecx.max_input_universe; let max_input_universe = outer_ecx.max_input_universe;
let mut nested_ecx = EvalCtxt { let mut nested_ecx = EvalCtxt {
infcx, delegate,
variables: outer_ecx.variables, variables: outer_ecx.variables,
var_values: outer_ecx.var_values, var_values: outer_ecx.var_values,
is_normalizes_to_goal: outer_ecx.is_normalizes_to_goal, is_normalizes_to_goal: outer_ecx.is_normalizes_to_goal,
@ -41,9 +41,9 @@ where
tainted: outer_ecx.tainted, tainted: outer_ecx.tainted,
inspect: outer_ecx.inspect.take_and_enter_probe(), inspect: outer_ecx.inspect.take_and_enter_probe(),
}; };
let r = nested_ecx.infcx.probe(|| { let r = nested_ecx.delegate.probe(|| {
let r = f(&mut nested_ecx); let r = f(&mut nested_ecx);
nested_ecx.inspect.probe_final_state(infcx, max_input_universe); nested_ecx.inspect.probe_final_state(delegate, max_input_universe);
r r
}); });
if !nested_ecx.inspect.is_noop() { if !nested_ecx.inspect.is_noop() {
@ -55,41 +55,38 @@ where
} }
} }
pub(in crate::solve) struct TraitProbeCtxt<'me, 'a, Infcx, I, F> pub(in crate::solve) struct TraitProbeCtxt<'me, 'a, D, I, F>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
cx: ProbeCtxt<'me, 'a, Infcx, I, F, QueryResult<I>>, cx: ProbeCtxt<'me, 'a, D, I, F, QueryResult<I>>,
source: CandidateSource<I>, source: CandidateSource<I>,
} }
impl<Infcx, I, F> TraitProbeCtxt<'_, '_, Infcx, I, F> impl<D, I, F> TraitProbeCtxt<'_, '_, D, I, F>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
F: FnOnce(&QueryResult<I>) -> inspect::ProbeKind<I>, F: FnOnce(&QueryResult<I>) -> inspect::ProbeKind<I>,
{ {
#[instrument(level = "debug", skip_all, fields(source = ?self.source))] #[instrument(level = "debug", skip_all, fields(source = ?self.source))]
pub(in crate::solve) fn enter( pub(in crate::solve) fn enter(
self, self,
f: impl FnOnce(&mut EvalCtxt<'_, Infcx>) -> QueryResult<I>, f: impl FnOnce(&mut EvalCtxt<'_, D>) -> QueryResult<I>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
self.cx.enter(|ecx| f(ecx)).map(|result| Candidate { source: self.source, result }) self.cx.enter(|ecx| f(ecx)).map(|result| Candidate { source: self.source, result })
} }
} }
impl<'a, Infcx, I> EvalCtxt<'a, Infcx, I> impl<'a, D, I> EvalCtxt<'a, D, I>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
/// `probe_kind` is only called when proof tree building is enabled so it can be /// `probe_kind` is only called when proof tree building is enabled so it can be
/// as expensive as necessary to output the desired information. /// as expensive as necessary to output the desired information.
pub(in crate::solve) fn probe<F, T>( pub(in crate::solve) fn probe<F, T>(&mut self, probe_kind: F) -> ProbeCtxt<'_, 'a, D, I, F, T>
&mut self,
probe_kind: F,
) -> ProbeCtxt<'_, 'a, Infcx, I, F, T>
where where
F: FnOnce(&T) -> inspect::ProbeKind<I>, F: FnOnce(&T) -> inspect::ProbeKind<I>,
{ {
@ -99,16 +96,14 @@ where
pub(in crate::solve) fn probe_builtin_trait_candidate( pub(in crate::solve) fn probe_builtin_trait_candidate(
&mut self, &mut self,
source: BuiltinImplSource, source: BuiltinImplSource,
) -> TraitProbeCtxt<'_, 'a, Infcx, I, impl FnOnce(&QueryResult<I>) -> inspect::ProbeKind<I>> ) -> TraitProbeCtxt<'_, 'a, D, I, impl FnOnce(&QueryResult<I>) -> inspect::ProbeKind<I>> {
{
self.probe_trait_candidate(CandidateSource::BuiltinImpl(source)) self.probe_trait_candidate(CandidateSource::BuiltinImpl(source))
} }
pub(in crate::solve) fn probe_trait_candidate( pub(in crate::solve) fn probe_trait_candidate(
&mut self, &mut self,
source: CandidateSource<I>, source: CandidateSource<I>,
) -> TraitProbeCtxt<'_, 'a, Infcx, I, impl FnOnce(&QueryResult<I>) -> inspect::ProbeKind<I>> ) -> TraitProbeCtxt<'_, 'a, D, I, impl FnOnce(&QueryResult<I>) -> inspect::ProbeKind<I>> {
{
TraitProbeCtxt { TraitProbeCtxt {
cx: ProbeCtxt { cx: ProbeCtxt {
ecx: self, ecx: self,

View File

@ -9,7 +9,7 @@ use std::mem;
use rustc_type_ir::{self as ty, Interner}; use rustc_type_ir::{self as ty, Interner};
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::eval_ctxt::canonical; use crate::solve::eval_ctxt::canonical;
use crate::solve::inspect; use crate::solve::inspect;
use crate::solve::{ use crate::solve::{
@ -37,12 +37,12 @@ use crate::solve::{
/// trees. At the end of trait solving `ProofTreeBuilder::finalize` /// trees. At the end of trait solving `ProofTreeBuilder::finalize`
/// is called to recursively convert the whole structure to a /// is called to recursively convert the whole structure to a
/// finished proof tree. /// finished proof tree.
pub(in crate::solve) struct ProofTreeBuilder<Infcx, I = <Infcx as SolverDelegate>::Interner> pub(in crate::solve) struct ProofTreeBuilder<D, I = <D as SolverDelegate>::Interner>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
_infcx: PhantomData<Infcx>, _infcx: PhantomData<D>,
state: Option<Box<DebugSolver<I>>>, state: Option<Box<DebugSolver<I>>>,
} }
@ -235,8 +235,8 @@ impl<I: Interner> WipProbeStep<I> {
} }
} }
impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> { impl<D: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<D> {
fn new(state: impl Into<DebugSolver<I>>) -> ProofTreeBuilder<Infcx> { fn new(state: impl Into<DebugSolver<I>>) -> ProofTreeBuilder<D> {
ProofTreeBuilder { state: Some(Box::new(state.into())), _infcx: PhantomData } ProofTreeBuilder { state: Some(Box::new(state.into())), _infcx: PhantomData }
} }
@ -258,7 +258,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> {
self.state.as_deref_mut() self.state.as_deref_mut()
} }
pub fn take_and_enter_probe(&mut self) -> ProofTreeBuilder<Infcx> { pub fn take_and_enter_probe(&mut self) -> ProofTreeBuilder<D> {
let mut nested = ProofTreeBuilder { state: self.state.take(), _infcx: PhantomData }; let mut nested = ProofTreeBuilder { state: self.state.take(), _infcx: PhantomData };
nested.enter_probe(); nested.enter_probe();
nested nested
@ -273,18 +273,18 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> {
} }
} }
pub fn new_maybe_root(generate_proof_tree: GenerateProofTree) -> ProofTreeBuilder<Infcx> { pub fn new_maybe_root(generate_proof_tree: GenerateProofTree) -> ProofTreeBuilder<D> {
match generate_proof_tree { match generate_proof_tree {
GenerateProofTree::No => ProofTreeBuilder::new_noop(), GenerateProofTree::No => ProofTreeBuilder::new_noop(),
GenerateProofTree::Yes => ProofTreeBuilder::new_root(), GenerateProofTree::Yes => ProofTreeBuilder::new_root(),
} }
} }
pub fn new_root() -> ProofTreeBuilder<Infcx> { pub fn new_root() -> ProofTreeBuilder<D> {
ProofTreeBuilder::new(DebugSolver::Root) ProofTreeBuilder::new(DebugSolver::Root)
} }
pub fn new_noop() -> ProofTreeBuilder<Infcx> { pub fn new_noop() -> ProofTreeBuilder<D> {
ProofTreeBuilder { state: None, _infcx: PhantomData } ProofTreeBuilder { state: None, _infcx: PhantomData }
} }
@ -297,7 +297,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> {
goal: Goal<I, I::Predicate>, goal: Goal<I, I::Predicate>,
orig_values: &[I::GenericArg], orig_values: &[I::GenericArg],
kind: GoalEvaluationKind, kind: GoalEvaluationKind,
) -> ProofTreeBuilder<Infcx> { ) -> ProofTreeBuilder<D> {
self.opt_nested(|| match kind { self.opt_nested(|| match kind {
GoalEvaluationKind::Root => Some(WipGoalEvaluation { GoalEvaluationKind::Root => Some(WipGoalEvaluation {
uncanonicalized_goal: goal, uncanonicalized_goal: goal,
@ -311,7 +311,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> {
pub fn new_canonical_goal_evaluation( pub fn new_canonical_goal_evaluation(
&mut self, &mut self,
goal: CanonicalInput<I>, goal: CanonicalInput<I>,
) -> ProofTreeBuilder<Infcx> { ) -> ProofTreeBuilder<D> {
self.nested(|| WipCanonicalGoalEvaluation { self.nested(|| WipCanonicalGoalEvaluation {
goal, goal,
kind: None, kind: None,
@ -337,10 +337,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> {
}) })
} }
pub fn canonical_goal_evaluation( pub fn canonical_goal_evaluation(&mut self, canonical_goal_evaluation: ProofTreeBuilder<D>) {
&mut self,
canonical_goal_evaluation: ProofTreeBuilder<Infcx>,
) {
if let Some(this) = self.as_mut() { if let Some(this) = self.as_mut() {
match (this, *canonical_goal_evaluation.state.unwrap()) { match (this, *canonical_goal_evaluation.state.unwrap()) {
( (
@ -366,7 +363,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> {
} }
} }
pub fn goal_evaluation(&mut self, goal_evaluation: ProofTreeBuilder<Infcx>) { pub fn goal_evaluation(&mut self, goal_evaluation: ProofTreeBuilder<D>) {
if let Some(this) = self.as_mut() { if let Some(this) = self.as_mut() {
match this { match this {
DebugSolver::Root => *this = *goal_evaluation.state.unwrap(), DebugSolver::Root => *this = *goal_evaluation.state.unwrap(),
@ -382,7 +379,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> {
&mut self, &mut self,
var_values: ty::CanonicalVarValues<I>, var_values: ty::CanonicalVarValues<I>,
instantiated_goal: QueryInput<I, I::Predicate>, instantiated_goal: QueryInput<I, I::Predicate>,
) -> ProofTreeBuilder<Infcx> { ) -> ProofTreeBuilder<D> {
self.nested(|| WipCanonicalGoalEvaluationStep { self.nested(|| WipCanonicalGoalEvaluationStep {
var_values: var_values.var_values.to_vec(), var_values: var_values.var_values.to_vec(),
instantiated_goal, instantiated_goal,
@ -396,7 +393,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> {
}) })
} }
pub fn goal_evaluation_step(&mut self, goal_evaluation_step: ProofTreeBuilder<Infcx>) { pub fn goal_evaluation_step(&mut self, goal_evaluation_step: ProofTreeBuilder<D>) {
if let Some(this) = self.as_mut() { if let Some(this) = self.as_mut() {
match (this, *goal_evaluation_step.state.unwrap()) { match (this, *goal_evaluation_step.state.unwrap()) {
( (
@ -448,12 +445,12 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> {
} }
} }
pub fn probe_final_state(&mut self, infcx: &Infcx, max_input_universe: ty::UniverseIndex) { pub fn probe_final_state(&mut self, delegate: &D, max_input_universe: ty::UniverseIndex) {
match self.as_mut() { match self.as_mut() {
None => {} None => {}
Some(DebugSolver::CanonicalGoalEvaluationStep(state)) => { Some(DebugSolver::CanonicalGoalEvaluationStep(state)) => {
let final_state = canonical::make_canonical_state( let final_state = canonical::make_canonical_state(
infcx, delegate,
&state.var_values, &state.var_values,
max_input_universe, max_input_universe,
(), (),
@ -467,21 +464,21 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> {
pub fn add_normalizes_to_goal( pub fn add_normalizes_to_goal(
&mut self, &mut self,
infcx: &Infcx, delegate: &D,
max_input_universe: ty::UniverseIndex, max_input_universe: ty::UniverseIndex,
goal: Goal<I, ty::NormalizesTo<I>>, goal: Goal<I, ty::NormalizesTo<I>>,
) { ) {
self.add_goal( self.add_goal(
infcx, delegate,
max_input_universe, max_input_universe,
GoalSource::Misc, GoalSource::Misc,
goal.with(infcx.interner(), goal.predicate), goal.with(delegate.cx(), goal.predicate),
); );
} }
pub fn add_goal( pub fn add_goal(
&mut self, &mut self,
infcx: &Infcx, delegate: &D,
max_input_universe: ty::UniverseIndex, max_input_universe: ty::UniverseIndex,
source: GoalSource, source: GoalSource,
goal: Goal<I, I::Predicate>, goal: Goal<I, I::Predicate>,
@ -490,7 +487,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> {
None => {} None => {}
Some(DebugSolver::CanonicalGoalEvaluationStep(state)) => { Some(DebugSolver::CanonicalGoalEvaluationStep(state)) => {
let goal = canonical::make_canonical_state( let goal = canonical::make_canonical_state(
infcx, delegate,
&state.var_values, &state.var_values,
max_input_universe, max_input_universe,
goal, goal,
@ -503,14 +500,14 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> {
pub(crate) fn record_impl_args( pub(crate) fn record_impl_args(
&mut self, &mut self,
infcx: &Infcx, delegate: &D,
max_input_universe: ty::UniverseIndex, max_input_universe: ty::UniverseIndex,
impl_args: I::GenericArgs, impl_args: I::GenericArgs,
) { ) {
match self.as_mut() { match self.as_mut() {
Some(DebugSolver::CanonicalGoalEvaluationStep(state)) => { Some(DebugSolver::CanonicalGoalEvaluationStep(state)) => {
let impl_args = canonical::make_canonical_state( let impl_args = canonical::make_canonical_state(
infcx, delegate,
&state.var_values, &state.var_values,
max_input_universe, max_input_universe,
impl_args, impl_args,
@ -538,7 +535,7 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> ProofTreeBuilder<Infcx> {
} }
} }
pub fn finish_probe(mut self) -> ProofTreeBuilder<Infcx> { pub fn finish_probe(mut self) -> ProofTreeBuilder<D> {
match self.as_mut() { match self.as_mut() {
None => {} None => {}
Some(DebugSolver::CanonicalGoalEvaluationStep(state)) => { Some(DebugSolver::CanonicalGoalEvaluationStep(state)) => {

View File

@ -29,7 +29,7 @@ use rustc_type_ir::{self as ty, Interner};
use tracing::instrument; use tracing::instrument;
pub use self::eval_ctxt::{EvalCtxt, GenerateProofTree, SolverDelegateEvalExt}; pub use self::eval_ctxt::{EvalCtxt, GenerateProofTree, SolverDelegateEvalExt};
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
/// How many fixpoint iterations we should attempt inside of the solver before bailing /// How many fixpoint iterations we should attempt inside of the solver before bailing
/// with overflow. /// with overflow.
@ -56,9 +56,9 @@ fn has_no_inference_or_external_constraints<I: Interner>(
&& response.value.external_constraints.opaque_types.is_empty() && response.value.external_constraints.opaque_types.is_empty()
} }
impl<'a, Infcx, I> EvalCtxt<'a, Infcx> impl<'a, D, I> EvalCtxt<'a, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
#[instrument(level = "trace", skip(self))] #[instrument(level = "trace", skip(self))]
@ -104,7 +104,7 @@ where
} }
fn compute_object_safe_goal(&mut self, trait_def_id: I::DefId) -> QueryResult<I> { fn compute_object_safe_goal(&mut self, trait_def_id: I::DefId) -> QueryResult<I> {
if self.interner().trait_is_object_safe(trait_def_id) { if self.cx().trait_is_object_safe(trait_def_id) {
self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes) self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes)
} else { } else {
Err(NoSolution) Err(NoSolution)
@ -182,7 +182,7 @@ where
return self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes); return self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes);
} }
ty::ConstKind::Unevaluated(uv) => { ty::ConstKind::Unevaluated(uv) => {
self.interner().type_of(uv.def).instantiate(self.interner(), &uv.args) self.cx().type_of(uv.def).instantiate(self.cx(), &uv.args)
} }
ty::ConstKind::Expr(_) => unimplemented!( ty::ConstKind::Expr(_) => unimplemented!(
"`feature(generic_const_exprs)` is not supported in the new trait solver" "`feature(generic_const_exprs)` is not supported in the new trait solver"
@ -193,7 +193,7 @@ where
ty::ConstKind::Bound(_, _) => panic!("escaping bound vars in {:?}", ct), ty::ConstKind::Bound(_, _) => panic!("escaping bound vars in {:?}", ct),
ty::ConstKind::Value(ty, _) => ty, ty::ConstKind::Value(ty, _) => ty,
ty::ConstKind::Placeholder(placeholder) => { ty::ConstKind::Placeholder(placeholder) => {
self.interner().find_const_ty_from_env(goal.param_env, placeholder) self.cx().find_const_ty_from_env(goal.param_env, placeholder)
} }
}; };
@ -202,9 +202,9 @@ where
} }
} }
impl<Infcx, I> EvalCtxt<'_, Infcx> impl<D, I> EvalCtxt<'_, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
/// Try to merge multiple possible ways to prove a goal, if that is not possible returns `None`. /// Try to merge multiple possible ways to prove a goal, if that is not possible returns `None`.
@ -267,7 +267,7 @@ where
if let ty::Alias(..) = ty.kind() { if let ty::Alias(..) = ty.kind() {
let normalized_ty = self.next_ty_infer(); let normalized_ty = self.next_ty_infer();
let alias_relate_goal = Goal::new( let alias_relate_goal = Goal::new(
self.interner(), self.cx(),
param_env, param_env,
ty::PredicateKind::AliasRelate( ty::PredicateKind::AliasRelate(
ty.into(), ty.into(),

View File

@ -1,12 +1,12 @@
use rustc_type_ir::{self as ty, Interner}; use rustc_type_ir::{self as ty, Interner};
use tracing::instrument; use tracing::instrument;
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::{Certainty, EvalCtxt, Goal, QueryResult}; use crate::solve::{Certainty, EvalCtxt, Goal, QueryResult};
impl<Infcx, I> EvalCtxt<'_, Infcx> impl<D, I> EvalCtxt<'_, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
#[instrument(level = "trace", skip(self), ret)] #[instrument(level = "trace", skip(self), ret)]

View File

@ -7,19 +7,19 @@
use rustc_type_ir::{self as ty, Interner}; use rustc_type_ir::{self as ty, Interner};
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::{Certainty, EvalCtxt, Goal, GoalSource, QueryResult}; use crate::solve::{Certainty, EvalCtxt, Goal, GoalSource, QueryResult};
impl<Infcx, I> EvalCtxt<'_, Infcx> impl<D, I> EvalCtxt<'_, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
pub(super) fn normalize_inherent_associated_type( pub(super) fn normalize_inherent_associated_type(
&mut self, &mut self,
goal: Goal<I, ty::NormalizesTo<I>>, goal: Goal<I, ty::NormalizesTo<I>>,
) -> QueryResult<I> { ) -> QueryResult<I> {
let tcx = self.interner(); let tcx = self.cx();
let inherent = goal.predicate.alias.expect_ty(tcx); let inherent = goal.predicate.alias.expect_ty(tcx);
let impl_def_id = tcx.parent(inherent.def_id); let impl_def_id = tcx.parent(inherent.def_id);

View File

@ -9,7 +9,7 @@ use rustc_type_ir::Upcast as _;
use rustc_type_ir::{self as ty, Interner, NormalizesTo}; use rustc_type_ir::{self as ty, Interner, NormalizesTo};
use tracing::instrument; use tracing::instrument;
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::assembly::structural_traits::{self, AsyncCallableRelevantTypes}; use crate::solve::assembly::structural_traits::{self, AsyncCallableRelevantTypes};
use crate::solve::assembly::{self, Candidate}; use crate::solve::assembly::{self, Candidate};
use crate::solve::inspect::ProbeKind; use crate::solve::inspect::ProbeKind;
@ -18,9 +18,9 @@ use crate::solve::{
NoSolution, QueryResult, NoSolution, QueryResult,
}; };
impl<Infcx, I> EvalCtxt<'_, Infcx> impl<D, I> EvalCtxt<'_, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
#[instrument(level = "trace", skip(self), ret)] #[instrument(level = "trace", skip(self), ret)]
@ -48,7 +48,7 @@ where
/// returns `NoSolution`. /// returns `NoSolution`.
#[instrument(level = "trace", skip(self), ret)] #[instrument(level = "trace", skip(self), ret)]
fn normalize_at_least_one_step(&mut self, goal: Goal<I, NormalizesTo<I>>) -> QueryResult<I> { fn normalize_at_least_one_step(&mut self, goal: Goal<I, NormalizesTo<I>>) -> QueryResult<I> {
match goal.predicate.alias.kind(self.interner()) { match goal.predicate.alias.kind(self.cx()) {
ty::AliasTermKind::ProjectionTy | ty::AliasTermKind::ProjectionConst => { ty::AliasTermKind::ProjectionTy | ty::AliasTermKind::ProjectionConst => {
let candidates = self.assemble_and_evaluate_candidates(goal); let candidates = self.assemble_and_evaluate_candidates(goal);
self.merge_candidates(candidates) self.merge_candidates(candidates)
@ -75,9 +75,9 @@ where
} }
} }
impl<Infcx, I> assembly::GoalKind<Infcx> for NormalizesTo<I> impl<D, I> assembly::GoalKind<D> for NormalizesTo<I>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
fn self_ty(self) -> I::Ty { fn self_ty(self) -> I::Ty {
@ -97,15 +97,15 @@ where
} }
fn probe_and_match_goal_against_assumption( fn probe_and_match_goal_against_assumption(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
source: CandidateSource<I>, source: CandidateSource<I>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
assumption: I::Clause, assumption: I::Clause,
then: impl FnOnce(&mut EvalCtxt<'_, Infcx>) -> QueryResult<I>, then: impl FnOnce(&mut EvalCtxt<'_, D>) -> QueryResult<I>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if let Some(projection_pred) = assumption.as_projection_clause() { if let Some(projection_pred) = assumption.as_projection_clause() {
if projection_pred.projection_def_id() == goal.predicate.def_id() { if projection_pred.projection_def_id() == goal.predicate.def_id() {
let tcx = ecx.interner(); let tcx = ecx.cx();
ecx.probe_trait_candidate(source).enter(|ecx| { ecx.probe_trait_candidate(source).enter(|ecx| {
let assumption_projection_pred = let assumption_projection_pred =
ecx.instantiate_binder_with_infer(projection_pred); ecx.instantiate_binder_with_infer(projection_pred);
@ -136,15 +136,15 @@ where
} }
fn consider_impl_candidate( fn consider_impl_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, NormalizesTo<I>>, goal: Goal<I, NormalizesTo<I>>,
impl_def_id: I::DefId, impl_def_id: I::DefId,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let tcx = ecx.interner(); let tcx = ecx.cx();
let goal_trait_ref = goal.predicate.alias.trait_ref(tcx); let goal_trait_ref = goal.predicate.alias.trait_ref(tcx);
let impl_trait_ref = tcx.impl_trait_ref(impl_def_id); let impl_trait_ref = tcx.impl_trait_ref(impl_def_id);
if !ecx.interner().args_may_unify_deep( if !ecx.cx().args_may_unify_deep(
goal.predicate.alias.trait_ref(tcx).args, goal.predicate.alias.trait_ref(tcx).args,
impl_trait_ref.skip_binder().args, impl_trait_ref.skip_binder().args,
) { ) {
@ -194,7 +194,7 @@ where
return ecx.evaluate_added_goals_and_make_canonical_response(Certainty::AMBIGUOUS); return ecx.evaluate_added_goals_and_make_canonical_response(Certainty::AMBIGUOUS);
}; };
let error_response = |ecx: &mut EvalCtxt<'_, Infcx>, msg: &str| { let error_response = |ecx: &mut EvalCtxt<'_, D>, msg: &str| {
let guar = tcx.delay_bug(msg); let guar = tcx.delay_bug(msg);
let error_term = match goal.predicate.alias.kind(tcx) { let error_term = match goal.predicate.alias.kind(tcx) {
ty::AliasTermKind::ProjectionTy => Ty::new_error(tcx, guar).into(), ty::AliasTermKind::ProjectionTy => Ty::new_error(tcx, guar).into(),
@ -262,61 +262,61 @@ where
/// Fail to normalize if the predicate contains an error, alternatively, we could normalize to `ty::Error` /// Fail to normalize if the predicate contains an error, alternatively, we could normalize to `ty::Error`
/// and succeed. Can experiment with this to figure out what results in better error messages. /// and succeed. Can experiment with this to figure out what results in better error messages.
fn consider_error_guaranteed_candidate( fn consider_error_guaranteed_candidate(
_ecx: &mut EvalCtxt<'_, Infcx>, _ecx: &mut EvalCtxt<'_, D>,
_guar: I::ErrorGuaranteed, _guar: I::ErrorGuaranteed,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
Err(NoSolution) Err(NoSolution)
} }
fn consider_auto_trait_candidate( fn consider_auto_trait_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
_goal: Goal<I, Self>, _goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
ecx.interner().delay_bug("associated types not allowed on auto traits"); ecx.cx().delay_bug("associated types not allowed on auto traits");
Err(NoSolution) Err(NoSolution)
} }
fn consider_trait_alias_candidate( fn consider_trait_alias_candidate(
_ecx: &mut EvalCtxt<'_, Infcx>, _ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
panic!("trait aliases do not have associated types: {:?}", goal); panic!("trait aliases do not have associated types: {:?}", goal);
} }
fn consider_builtin_sized_candidate( fn consider_builtin_sized_candidate(
_ecx: &mut EvalCtxt<'_, Infcx>, _ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
panic!("`Sized` does not have an associated type: {:?}", goal); panic!("`Sized` does not have an associated type: {:?}", goal);
} }
fn consider_builtin_copy_clone_candidate( fn consider_builtin_copy_clone_candidate(
_ecx: &mut EvalCtxt<'_, Infcx>, _ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
panic!("`Copy`/`Clone` does not have an associated type: {:?}", goal); panic!("`Copy`/`Clone` does not have an associated type: {:?}", goal);
} }
fn consider_builtin_pointer_like_candidate( fn consider_builtin_pointer_like_candidate(
_ecx: &mut EvalCtxt<'_, Infcx>, _ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
panic!("`PointerLike` does not have an associated type: {:?}", goal); panic!("`PointerLike` does not have an associated type: {:?}", goal);
} }
fn consider_builtin_fn_ptr_trait_candidate( fn consider_builtin_fn_ptr_trait_candidate(
_ecx: &mut EvalCtxt<'_, Infcx>, _ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
panic!("`FnPtr` does not have an associated type: {:?}", goal); panic!("`FnPtr` does not have an associated type: {:?}", goal);
} }
fn consider_builtin_fn_trait_candidates( fn consider_builtin_fn_trait_candidates(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
goal_kind: ty::ClosureKind, goal_kind: ty::ClosureKind,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let tcx = ecx.interner(); let tcx = ecx.cx();
let tupled_inputs_and_output = let tupled_inputs_and_output =
match structural_traits::extract_tupled_inputs_and_output_from_callable( match structural_traits::extract_tupled_inputs_and_output_from_callable(
tcx, tcx,
@ -355,11 +355,11 @@ where
} }
fn consider_builtin_async_fn_trait_candidates( fn consider_builtin_async_fn_trait_candidates(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
goal_kind: ty::ClosureKind, goal_kind: ty::ClosureKind,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let tcx = ecx.interner(); let tcx = ecx.cx();
let env_region = match goal_kind { let env_region = match goal_kind {
ty::ClosureKind::Fn | ty::ClosureKind::FnMut => goal.predicate.alias.args.region_at(2), ty::ClosureKind::Fn | ty::ClosureKind::FnMut => goal.predicate.alias.args.region_at(2),
@ -457,7 +457,7 @@ where
} }
fn consider_builtin_async_fn_kind_helper_candidate( fn consider_builtin_async_fn_kind_helper_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let [ let [
@ -489,7 +489,7 @@ where
} }
let upvars_ty = ty::CoroutineClosureSignature::tupled_upvars_by_closure_kind( let upvars_ty = ty::CoroutineClosureSignature::tupled_upvars_by_closure_kind(
ecx.interner(), ecx.cx(),
goal_kind, goal_kind,
tupled_inputs_ty.expect_ty(), tupled_inputs_ty.expect_ty(),
tupled_upvars_ty.expect_ty(), tupled_upvars_ty.expect_ty(),
@ -504,17 +504,17 @@ where
} }
fn consider_builtin_tuple_candidate( fn consider_builtin_tuple_candidate(
_ecx: &mut EvalCtxt<'_, Infcx>, _ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
panic!("`Tuple` does not have an associated type: {:?}", goal); panic!("`Tuple` does not have an associated type: {:?}", goal);
} }
fn consider_builtin_pointee_candidate( fn consider_builtin_pointee_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let tcx = ecx.interner(); let tcx = ecx.cx();
let metadata_def_id = tcx.require_lang_item(TraitSolverLangItem::Metadata); let metadata_def_id = tcx.require_lang_item(TraitSolverLangItem::Metadata);
assert_eq!(metadata_def_id, goal.predicate.def_id()); assert_eq!(metadata_def_id, goal.predicate.def_id());
ecx.probe_builtin_trait_candidate(BuiltinImplSource::Misc).enter(|ecx| { ecx.probe_builtin_trait_candidate(BuiltinImplSource::Misc).enter(|ecx| {
@ -592,7 +592,7 @@ where
} }
fn consider_builtin_future_candidate( fn consider_builtin_future_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let self_ty = goal.predicate.self_ty(); let self_ty = goal.predicate.self_ty();
@ -601,7 +601,7 @@ where
}; };
// Coroutines are not futures unless they come from `async` desugaring // Coroutines are not futures unless they come from `async` desugaring
let tcx = ecx.interner(); let tcx = ecx.cx();
if !tcx.coroutine_is_async(def_id) { if !tcx.coroutine_is_async(def_id) {
return Err(NoSolution); return Err(NoSolution);
} }
@ -613,11 +613,7 @@ where
CandidateSource::BuiltinImpl(BuiltinImplSource::Misc), CandidateSource::BuiltinImpl(BuiltinImplSource::Misc),
goal, goal,
ty::ProjectionPredicate { ty::ProjectionPredicate {
projection_term: ty::AliasTerm::new( projection_term: ty::AliasTerm::new(ecx.cx(), goal.predicate.def_id(), [self_ty]),
ecx.interner(),
goal.predicate.def_id(),
[self_ty],
),
term, term,
} }
.upcast(tcx), .upcast(tcx),
@ -628,7 +624,7 @@ where
} }
fn consider_builtin_iterator_candidate( fn consider_builtin_iterator_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let self_ty = goal.predicate.self_ty(); let self_ty = goal.predicate.self_ty();
@ -637,7 +633,7 @@ where
}; };
// Coroutines are not Iterators unless they come from `gen` desugaring // Coroutines are not Iterators unless they come from `gen` desugaring
let tcx = ecx.interner(); let tcx = ecx.cx();
if !tcx.coroutine_is_gen(def_id) { if !tcx.coroutine_is_gen(def_id) {
return Err(NoSolution); return Err(NoSolution);
} }
@ -649,11 +645,7 @@ where
CandidateSource::BuiltinImpl(BuiltinImplSource::Misc), CandidateSource::BuiltinImpl(BuiltinImplSource::Misc),
goal, goal,
ty::ProjectionPredicate { ty::ProjectionPredicate {
projection_term: ty::AliasTerm::new( projection_term: ty::AliasTerm::new(ecx.cx(), goal.predicate.def_id(), [self_ty]),
ecx.interner(),
goal.predicate.def_id(),
[self_ty],
),
term, term,
} }
.upcast(tcx), .upcast(tcx),
@ -664,14 +656,14 @@ where
} }
fn consider_builtin_fused_iterator_candidate( fn consider_builtin_fused_iterator_candidate(
_ecx: &mut EvalCtxt<'_, Infcx>, _ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
panic!("`FusedIterator` does not have an associated type: {:?}", goal); panic!("`FusedIterator` does not have an associated type: {:?}", goal);
} }
fn consider_builtin_async_iterator_candidate( fn consider_builtin_async_iterator_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let self_ty = goal.predicate.self_ty(); let self_ty = goal.predicate.self_ty();
@ -680,7 +672,7 @@ where
}; };
// Coroutines are not AsyncIterators unless they come from `gen` desugaring // Coroutines are not AsyncIterators unless they come from `gen` desugaring
let tcx = ecx.interner(); let tcx = ecx.cx();
if !tcx.coroutine_is_async_gen(def_id) { if !tcx.coroutine_is_async_gen(def_id) {
return Err(NoSolution); return Err(NoSolution);
} }
@ -707,7 +699,7 @@ where
} }
fn consider_builtin_coroutine_candidate( fn consider_builtin_coroutine_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let self_ty = goal.predicate.self_ty(); let self_ty = goal.predicate.self_ty();
@ -716,7 +708,7 @@ where
}; };
// `async`-desugared coroutines do not implement the coroutine trait // `async`-desugared coroutines do not implement the coroutine trait
let tcx = ecx.interner(); let tcx = ecx.cx();
if !tcx.is_general_coroutine(def_id) { if !tcx.is_general_coroutine(def_id) {
return Err(NoSolution); return Err(NoSolution);
} }
@ -739,7 +731,7 @@ where
goal, goal,
ty::ProjectionPredicate { ty::ProjectionPredicate {
projection_term: ty::AliasTerm::new( projection_term: ty::AliasTerm::new(
ecx.interner(), ecx.cx(),
goal.predicate.def_id(), goal.predicate.def_id(),
[self_ty, coroutine.resume_ty()], [self_ty, coroutine.resume_ty()],
), ),
@ -753,14 +745,14 @@ where
} }
fn consider_structural_builtin_unsize_candidates( fn consider_structural_builtin_unsize_candidates(
_ecx: &mut EvalCtxt<'_, Infcx>, _ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Vec<Candidate<I>> { ) -> Vec<Candidate<I>> {
panic!("`Unsize` does not have an associated type: {:?}", goal); panic!("`Unsize` does not have an associated type: {:?}", goal);
} }
fn consider_builtin_discriminant_kind_candidate( fn consider_builtin_discriminant_kind_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let self_ty = goal.predicate.self_ty(); let self_ty = goal.predicate.self_ty();
@ -788,7 +780,7 @@ where
| ty::Slice(_) | ty::Slice(_)
| ty::Dynamic(_, _, _) | ty::Dynamic(_, _, _)
| ty::Tuple(_) | ty::Tuple(_)
| ty::Error(_) => self_ty.discriminant_ty(ecx.interner()), | ty::Error(_) => self_ty.discriminant_ty(ecx.cx()),
// We do not call `Ty::discriminant_ty` on alias, param, or placeholder // We do not call `Ty::discriminant_ty` on alias, param, or placeholder
// types, which return `<self_ty as DiscriminantKind>::Discriminant` // types, which return `<self_ty as DiscriminantKind>::Discriminant`
@ -812,7 +804,7 @@ where
} }
fn consider_builtin_async_destruct_candidate( fn consider_builtin_async_destruct_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let self_ty = goal.predicate.self_ty(); let self_ty = goal.predicate.self_ty();
@ -835,7 +827,7 @@ where
| ty::Str | ty::Str
| ty::Slice(_) | ty::Slice(_)
| ty::Tuple(_) | ty::Tuple(_)
| ty::Error(_) => self_ty.async_destructor_ty(ecx.interner()), | ty::Error(_) => self_ty.async_destructor_ty(ecx.cx()),
// We do not call `Ty::async_destructor_ty` on alias, param, or placeholder // We do not call `Ty::async_destructor_ty` on alias, param, or placeholder
// types, which return `<self_ty as AsyncDestruct>::AsyncDestructor` // types, which return `<self_ty as AsyncDestruct>::AsyncDestructor`
@ -865,23 +857,23 @@ where
} }
fn consider_builtin_destruct_candidate( fn consider_builtin_destruct_candidate(
_ecx: &mut EvalCtxt<'_, Infcx>, _ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
panic!("`Destruct` does not have an associated type: {:?}", goal); panic!("`Destruct` does not have an associated type: {:?}", goal);
} }
fn consider_builtin_transmute_candidate( fn consider_builtin_transmute_candidate(
_ecx: &mut EvalCtxt<'_, Infcx>, _ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
panic!("`BikeshedIntrinsicFrom` does not have an associated type: {:?}", goal) panic!("`BikeshedIntrinsicFrom` does not have an associated type: {:?}", goal)
} }
} }
impl<Infcx, I> EvalCtxt<'_, Infcx> impl<D, I> EvalCtxt<'_, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
fn translate_args( fn translate_args(
@ -892,7 +884,7 @@ where
impl_trait_ref: rustc_type_ir::TraitRef<I>, impl_trait_ref: rustc_type_ir::TraitRef<I>,
target_container_def_id: I::DefId, target_container_def_id: I::DefId,
) -> Result<I::GenericArgs, NoSolution> { ) -> Result<I::GenericArgs, NoSolution> {
let tcx = self.interner(); let tcx = self.cx();
Ok(if target_container_def_id == impl_trait_ref.def_id { Ok(if target_container_def_id == impl_trait_ref.def_id {
// Default value from the trait definition. No need to rebase. // Default value from the trait definition. No need to rebase.
goal.predicate.alias.args goal.predicate.alias.args

View File

@ -6,19 +6,19 @@ use rustc_index::bit_set::GrowableBitSet;
use rustc_type_ir::inherent::*; use rustc_type_ir::inherent::*;
use rustc_type_ir::{self as ty, Interner}; use rustc_type_ir::{self as ty, Interner};
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::{Certainty, EvalCtxt, Goal, NoSolution, QueryResult, Reveal, SolverMode}; use crate::solve::{Certainty, EvalCtxt, Goal, NoSolution, QueryResult, Reveal, SolverMode};
impl<Infcx, I> EvalCtxt<'_, Infcx> impl<D, I> EvalCtxt<'_, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
pub(super) fn normalize_opaque_type( pub(super) fn normalize_opaque_type(
&mut self, &mut self,
goal: Goal<I, ty::NormalizesTo<I>>, goal: Goal<I, ty::NormalizesTo<I>>,
) -> QueryResult<I> { ) -> QueryResult<I> {
let tcx = self.interner(); let tcx = self.cx();
let opaque_ty = goal.predicate.alias; let opaque_ty = goal.predicate.alias;
let expected = goal.predicate.term.as_type().expect("no such thing as an opaque const"); let expected = goal.predicate.term.as_type().expect("no such thing as an opaque const");
@ -34,7 +34,7 @@ where
return Err(NoSolution); return Err(NoSolution);
} }
// FIXME: This may have issues when the args contain aliases... // FIXME: This may have issues when the args contain aliases...
match uses_unique_placeholders_ignoring_regions(self.interner(), opaque_ty.args) { match uses_unique_placeholders_ignoring_regions(self.cx(), opaque_ty.args) {
Err(NotUniqueParam::NotParam(param)) if param.is_non_region_infer() => { Err(NotUniqueParam::NotParam(param)) if param.is_non_region_infer() => {
return self.evaluate_added_goals_and_make_canonical_response( return self.evaluate_added_goals_and_make_canonical_response(
Certainty::AMBIGUOUS, Certainty::AMBIGUOUS,

View File

@ -6,19 +6,19 @@
use rustc_type_ir::{self as ty, Interner}; use rustc_type_ir::{self as ty, Interner};
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::{Certainty, EvalCtxt, Goal, GoalSource, QueryResult}; use crate::solve::{Certainty, EvalCtxt, Goal, GoalSource, QueryResult};
impl<Infcx, I> EvalCtxt<'_, Infcx> impl<D, I> EvalCtxt<'_, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
pub(super) fn normalize_weak_type( pub(super) fn normalize_weak_type(
&mut self, &mut self,
goal: Goal<I, ty::NormalizesTo<I>>, goal: Goal<I, ty::NormalizesTo<I>>,
) -> QueryResult<I> { ) -> QueryResult<I> {
let tcx = self.interner(); let tcx = self.cx();
let weak_ty = goal.predicate.alias; let weak_ty = goal.predicate.alias;
// Check where clauses // Check where clauses

View File

@ -1,12 +1,12 @@
use rustc_type_ir::{self as ty, Interner, ProjectionPredicate}; use rustc_type_ir::{self as ty, Interner, ProjectionPredicate};
use tracing::instrument; use tracing::instrument;
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::{Certainty, EvalCtxt, Goal, GoalSource, QueryResult}; use crate::solve::{Certainty, EvalCtxt, Goal, GoalSource, QueryResult};
impl<Infcx, I> EvalCtxt<'_, Infcx> impl<D, I> EvalCtxt<'_, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
#[instrument(level = "trace", skip(self), ret)] #[instrument(level = "trace", skip(self), ret)]
@ -14,7 +14,7 @@ where
&mut self, &mut self,
goal: Goal<I, ProjectionPredicate<I>>, goal: Goal<I, ProjectionPredicate<I>>,
) -> QueryResult<I> { ) -> QueryResult<I> {
let tcx = self.interner(); let tcx = self.cx();
let projection_term = goal.predicate.projection_term.to_term(tcx); let projection_term = goal.predicate.projection_term.to_term(tcx);
let goal = goal.with( let goal = goal.with(
tcx, tcx,

View File

@ -6,7 +6,7 @@ use rustc_type_ir::inherent::*;
use rustc_type_ir::Interner; use rustc_type_ir::Interner;
use tracing::debug; use tracing::debug;
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::inspect::{self, ProofTreeBuilder}; use crate::solve::inspect::{self, ProofTreeBuilder};
use crate::solve::{ use crate::solve::{
CacheData, CanonicalInput, Certainty, QueryResult, SolverMode, FIXPOINT_STEP_LIMIT, CacheData, CanonicalInput, Certainty, QueryResult, SolverMode, FIXPOINT_STEP_LIMIT,
@ -255,12 +255,12 @@ impl<I: Interner> SearchGraph<I> {
/// ///
/// Given some goal which is proven via the `prove_goal` closure, this /// Given some goal which is proven via the `prove_goal` closure, this
/// handles caching, overflow, and coinductive cycles. /// handles caching, overflow, and coinductive cycles.
pub(super) fn with_new_goal<Infcx: SolverDelegate<Interner = I>>( pub(super) fn with_new_goal<D: SolverDelegate<Interner = I>>(
&mut self, &mut self,
tcx: I, tcx: I,
input: CanonicalInput<I>, input: CanonicalInput<I>,
inspect: &mut ProofTreeBuilder<Infcx>, inspect: &mut ProofTreeBuilder<D>,
mut prove_goal: impl FnMut(&mut Self, &mut ProofTreeBuilder<Infcx>) -> QueryResult<I>, mut prove_goal: impl FnMut(&mut Self, &mut ProofTreeBuilder<D>) -> QueryResult<I>,
) -> QueryResult<I> { ) -> QueryResult<I> {
self.check_invariants(); self.check_invariants();
// Check for overflow. // Check for overflow.
@ -416,12 +416,12 @@ impl<I: Interner> SearchGraph<I> {
/// Try to fetch a previously computed result from the global cache, /// Try to fetch a previously computed result from the global cache,
/// making sure to only do so if it would match the result of reevaluating /// making sure to only do so if it would match the result of reevaluating
/// this goal. /// this goal.
fn lookup_global_cache<Infcx: SolverDelegate<Interner = I>>( fn lookup_global_cache<D: SolverDelegate<Interner = I>>(
&mut self, &mut self,
tcx: I, tcx: I,
input: CanonicalInput<I>, input: CanonicalInput<I>,
available_depth: SolverLimit, available_depth: SolverLimit,
inspect: &mut ProofTreeBuilder<Infcx>, inspect: &mut ProofTreeBuilder<D>,
) -> Option<QueryResult<I>> { ) -> Option<QueryResult<I>> {
let CacheData { result, proof_tree, additional_depth, encountered_overflow } = self let CacheData { result, proof_tree, additional_depth, encountered_overflow } = self
.global_cache(tcx) .global_cache(tcx)
@ -465,16 +465,16 @@ impl<I: Interner> SearchGraph<I> {
/// of this we continuously recompute the cycle until the result /// of this we continuously recompute the cycle until the result
/// of the previous iteration is equal to the final result, at which /// of the previous iteration is equal to the final result, at which
/// point we are done. /// point we are done.
fn fixpoint_step_in_task<Infcx, F>( fn fixpoint_step_in_task<D, F>(
&mut self, &mut self,
tcx: I, tcx: I,
input: CanonicalInput<I>, input: CanonicalInput<I>,
inspect: &mut ProofTreeBuilder<Infcx>, inspect: &mut ProofTreeBuilder<D>,
prove_goal: &mut F, prove_goal: &mut F,
) -> StepResult<I> ) -> StepResult<I>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
F: FnMut(&mut Self, &mut ProofTreeBuilder<Infcx>) -> QueryResult<I>, F: FnMut(&mut Self, &mut ProofTreeBuilder<D>) -> QueryResult<I>,
{ {
let result = prove_goal(self, inspect); let result = prove_goal(self, inspect);
let stack_entry = self.pop_stack(); let stack_entry = self.pop_stack();

View File

@ -8,7 +8,7 @@ use rustc_type_ir::visit::TypeVisitableExt as _;
use rustc_type_ir::{self as ty, Interner, TraitPredicate, Upcast as _}; use rustc_type_ir::{self as ty, Interner, TraitPredicate, Upcast as _};
use tracing::{instrument, trace}; use tracing::{instrument, trace};
use crate::infcx::SolverDelegate; use crate::delegate::SolverDelegate;
use crate::solve::assembly::structural_traits::{self, AsyncCallableRelevantTypes}; use crate::solve::assembly::structural_traits::{self, AsyncCallableRelevantTypes};
use crate::solve::assembly::{self, Candidate}; use crate::solve::assembly::{self, Candidate};
use crate::solve::inspect::ProbeKind; use crate::solve::inspect::ProbeKind;
@ -17,9 +17,9 @@ use crate::solve::{
NoSolution, QueryResult, Reveal, SolverMode, NoSolution, QueryResult, Reveal, SolverMode,
}; };
impl<Infcx, I> assembly::GoalKind<Infcx> for TraitPredicate<I> impl<D, I> assembly::GoalKind<D> for TraitPredicate<I>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
fn self_ty(self) -> I::Ty { fn self_ty(self) -> I::Ty {
@ -39,11 +39,11 @@ where
} }
fn consider_impl_candidate( fn consider_impl_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, TraitPredicate<I>>, goal: Goal<I, TraitPredicate<I>>,
impl_def_id: I::DefId, impl_def_id: I::DefId,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let tcx = ecx.interner(); let tcx = ecx.cx();
let impl_trait_ref = tcx.impl_trait_ref(impl_def_id); let impl_trait_ref = tcx.impl_trait_ref(impl_def_id);
if !tcx if !tcx
@ -91,7 +91,7 @@ where
} }
fn consider_error_guaranteed_candidate( fn consider_error_guaranteed_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
_guar: I::ErrorGuaranteed, _guar: I::ErrorGuaranteed,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
// FIXME: don't need to enter a probe here. // FIXME: don't need to enter a probe here.
@ -100,11 +100,11 @@ where
} }
fn probe_and_match_goal_against_assumption( fn probe_and_match_goal_against_assumption(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
source: CandidateSource<I>, source: CandidateSource<I>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
assumption: I::Clause, assumption: I::Clause,
then: impl FnOnce(&mut EvalCtxt<'_, Infcx>) -> QueryResult<I>, then: impl FnOnce(&mut EvalCtxt<'_, D>) -> QueryResult<I>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if let Some(trait_clause) = assumption.as_trait_clause() { if let Some(trait_clause) = assumption.as_trait_clause() {
if trait_clause.def_id() == goal.predicate.def_id() if trait_clause.def_id() == goal.predicate.def_id()
@ -128,7 +128,7 @@ where
} }
fn consider_auto_trait_candidate( fn consider_auto_trait_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -174,14 +174,14 @@ where
} }
fn consider_trait_alias_candidate( fn consider_trait_alias_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
return Err(NoSolution); return Err(NoSolution);
} }
let tcx = ecx.interner(); let tcx = ecx.cx();
ecx.probe_builtin_trait_candidate(BuiltinImplSource::Misc).enter(|ecx| { ecx.probe_builtin_trait_candidate(BuiltinImplSource::Misc).enter(|ecx| {
let nested_obligations = tcx let nested_obligations = tcx
@ -195,7 +195,7 @@ where
} }
fn consider_builtin_sized_candidate( fn consider_builtin_sized_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -210,7 +210,7 @@ where
} }
fn consider_builtin_copy_clone_candidate( fn consider_builtin_copy_clone_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -225,14 +225,14 @@ where
} }
fn consider_builtin_pointer_like_candidate( fn consider_builtin_pointer_like_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
return Err(NoSolution); return Err(NoSolution);
} }
let tcx = ecx.interner(); let tcx = ecx.cx();
// But if there are inference variables, we have to wait until it's resolved. // But if there are inference variables, we have to wait until it's resolved.
if (goal.param_env, goal.predicate.self_ty()).has_non_region_infer() { if (goal.param_env, goal.predicate.self_ty()).has_non_region_infer() {
return ecx.forced_ambiguity(MaybeCause::Ambiguity); return ecx.forced_ambiguity(MaybeCause::Ambiguity);
@ -247,7 +247,7 @@ where
} }
fn consider_builtin_fn_ptr_trait_candidate( fn consider_builtin_fn_ptr_trait_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let self_ty = goal.predicate.self_ty(); let self_ty = goal.predicate.self_ty();
@ -278,7 +278,7 @@ where
} }
fn consider_builtin_fn_trait_candidates( fn consider_builtin_fn_trait_candidates(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
goal_kind: ty::ClosureKind, goal_kind: ty::ClosureKind,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
@ -286,7 +286,7 @@ where
return Err(NoSolution); return Err(NoSolution);
} }
let tcx = ecx.interner(); let tcx = ecx.cx();
let tupled_inputs_and_output = let tupled_inputs_and_output =
match structural_traits::extract_tupled_inputs_and_output_from_callable( match structural_traits::extract_tupled_inputs_and_output_from_callable(
tcx, tcx,
@ -319,7 +319,7 @@ where
} }
fn consider_builtin_async_fn_trait_candidates( fn consider_builtin_async_fn_trait_candidates(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
goal_kind: ty::ClosureKind, goal_kind: ty::ClosureKind,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
@ -327,7 +327,7 @@ where
return Err(NoSolution); return Err(NoSolution);
} }
let tcx = ecx.interner(); let tcx = ecx.cx();
let (tupled_inputs_and_output_and_coroutine, nested_preds) = let (tupled_inputs_and_output_and_coroutine, nested_preds) =
structural_traits::extract_tupled_inputs_and_output_from_async_callable( structural_traits::extract_tupled_inputs_and_output_from_async_callable(
tcx, tcx,
@ -370,7 +370,7 @@ where
} }
fn consider_builtin_async_fn_kind_helper_candidate( fn consider_builtin_async_fn_kind_helper_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let [closure_fn_kind_ty, goal_kind_ty] = **goal.predicate.trait_ref.args else { let [closure_fn_kind_ty, goal_kind_ty] = **goal.predicate.trait_ref.args else {
@ -397,7 +397,7 @@ where
/// impl Tuple for (T1, .., Tn) {} /// impl Tuple for (T1, .., Tn) {}
/// ``` /// ```
fn consider_builtin_tuple_candidate( fn consider_builtin_tuple_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -413,7 +413,7 @@ where
} }
fn consider_builtin_pointee_candidate( fn consider_builtin_pointee_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -425,7 +425,7 @@ where
} }
fn consider_builtin_future_candidate( fn consider_builtin_future_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -437,7 +437,7 @@ where
}; };
// Coroutines are not futures unless they come from `async` desugaring // Coroutines are not futures unless they come from `async` desugaring
let tcx = ecx.interner(); let tcx = ecx.cx();
if !tcx.coroutine_is_async(def_id) { if !tcx.coroutine_is_async(def_id) {
return Err(NoSolution); return Err(NoSolution);
} }
@ -451,7 +451,7 @@ where
} }
fn consider_builtin_iterator_candidate( fn consider_builtin_iterator_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -463,7 +463,7 @@ where
}; };
// Coroutines are not iterators unless they come from `gen` desugaring // Coroutines are not iterators unless they come from `gen` desugaring
let tcx = ecx.interner(); let tcx = ecx.cx();
if !tcx.coroutine_is_gen(def_id) { if !tcx.coroutine_is_gen(def_id) {
return Err(NoSolution); return Err(NoSolution);
} }
@ -477,7 +477,7 @@ where
} }
fn consider_builtin_fused_iterator_candidate( fn consider_builtin_fused_iterator_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -489,7 +489,7 @@ where
}; };
// Coroutines are not iterators unless they come from `gen` desugaring // Coroutines are not iterators unless they come from `gen` desugaring
let tcx = ecx.interner(); let tcx = ecx.cx();
if !tcx.coroutine_is_gen(def_id) { if !tcx.coroutine_is_gen(def_id) {
return Err(NoSolution); return Err(NoSolution);
} }
@ -501,7 +501,7 @@ where
} }
fn consider_builtin_async_iterator_candidate( fn consider_builtin_async_iterator_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -513,7 +513,7 @@ where
}; };
// Coroutines are not iterators unless they come from `gen` desugaring // Coroutines are not iterators unless they come from `gen` desugaring
let tcx = ecx.interner(); let tcx = ecx.cx();
if !tcx.coroutine_is_async_gen(def_id) { if !tcx.coroutine_is_async_gen(def_id) {
return Err(NoSolution); return Err(NoSolution);
} }
@ -527,7 +527,7 @@ where
} }
fn consider_builtin_coroutine_candidate( fn consider_builtin_coroutine_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -540,7 +540,7 @@ where
}; };
// `async`-desugared coroutines do not implement the coroutine trait // `async`-desugared coroutines do not implement the coroutine trait
let tcx = ecx.interner(); let tcx = ecx.cx();
if !tcx.is_general_coroutine(def_id) { if !tcx.is_general_coroutine(def_id) {
return Err(NoSolution); return Err(NoSolution);
} }
@ -559,7 +559,7 @@ where
} }
fn consider_builtin_discriminant_kind_candidate( fn consider_builtin_discriminant_kind_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -572,7 +572,7 @@ where
} }
fn consider_builtin_async_destruct_candidate( fn consider_builtin_async_destruct_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -585,7 +585,7 @@ where
} }
fn consider_builtin_destruct_candidate( fn consider_builtin_destruct_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -601,7 +601,7 @@ where
} }
fn consider_builtin_transmute_candidate( fn consider_builtin_transmute_candidate(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -634,7 +634,7 @@ where
/// impl<'a, T: Trait + 'a> Unsize<dyn Trait + 'a> for T {} /// impl<'a, T: Trait + 'a> Unsize<dyn Trait + 'a> for T {}
/// ``` /// ```
fn consider_structural_builtin_unsize_candidates( fn consider_structural_builtin_unsize_candidates(
ecx: &mut EvalCtxt<'_, Infcx>, ecx: &mut EvalCtxt<'_, D>,
goal: Goal<I, Self>, goal: Goal<I, Self>,
) -> Vec<Candidate<I>> { ) -> Vec<Candidate<I>> {
if goal.predicate.polarity != ty::PredicatePolarity::Positive { if goal.predicate.polarity != ty::PredicatePolarity::Positive {
@ -657,7 +657,7 @@ where
return vec![]; return vec![];
}; };
let goal = goal.with(ecx.interner(), (a_ty, b_ty)); let goal = goal.with(ecx.cx(), (a_ty, b_ty));
match (a_ty.kind(), b_ty.kind()) { match (a_ty.kind(), b_ty.kind()) {
(ty::Infer(ty::TyVar(..)), ..) => panic!("unexpected infer {a_ty:?} {b_ty:?}"), (ty::Infer(ty::TyVar(..)), ..) => panic!("unexpected infer {a_ty:?} {b_ty:?}"),
@ -705,9 +705,9 @@ where
} }
} }
impl<Infcx, I> EvalCtxt<'_, Infcx> impl<D, I> EvalCtxt<'_, D>
where where
Infcx: SolverDelegate<Interner = I>, D: SolverDelegate<Interner = I>,
I: Interner, I: Interner,
{ {
/// Trait upcasting allows for coercions between trait objects: /// Trait upcasting allows for coercions between trait objects:
@ -727,7 +727,7 @@ where
b_data: I::BoundExistentialPredicates, b_data: I::BoundExistentialPredicates,
b_region: I::Region, b_region: I::Region,
) -> Vec<Candidate<I>> { ) -> Vec<Candidate<I>> {
let tcx = self.interner(); let tcx = self.cx();
let Goal { predicate: (a_ty, _b_ty), .. } = goal; let Goal { predicate: (a_ty, _b_ty), .. } = goal;
let mut responses = vec![]; let mut responses = vec![];
@ -745,8 +745,7 @@ where
)); ));
} else if let Some(a_principal) = a_data.principal() { } else if let Some(a_principal) = a_data.principal() {
for new_a_principal in for new_a_principal in
Infcx::elaborate_supertraits(self.interner(), a_principal.with_self_ty(tcx, a_ty)) D::elaborate_supertraits(self.cx(), a_principal.with_self_ty(tcx, a_ty)).skip(1)
.skip(1)
{ {
responses.extend(self.consider_builtin_upcast_to_principal( responses.extend(self.consider_builtin_upcast_to_principal(
goal, goal,
@ -771,7 +770,7 @@ where
b_data: I::BoundExistentialPredicates, b_data: I::BoundExistentialPredicates,
b_region: I::Region, b_region: I::Region,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let tcx = self.interner(); let tcx = self.cx();
let Goal { predicate: (a_ty, _), .. } = goal; let Goal { predicate: (a_ty, _), .. } = goal;
// Can only unsize to an object-safe trait. // Can only unsize to an object-safe trait.
@ -825,10 +824,10 @@ where
.auto_traits() .auto_traits()
.into_iter() .into_iter()
.chain(a_data.principal_def_id().into_iter().flat_map(|principal_def_id| { .chain(a_data.principal_def_id().into_iter().flat_map(|principal_def_id| {
self.interner() self.cx()
.supertrait_def_ids(principal_def_id) .supertrait_def_ids(principal_def_id)
.into_iter() .into_iter()
.filter(|def_id| self.interner().trait_is_auto(*def_id)) .filter(|def_id| self.cx().trait_is_auto(*def_id))
})) }))
.collect(); .collect();
@ -837,7 +836,7 @@ where
// having any inference side-effects. We process obligations because // having any inference side-effects. We process obligations because
// unification may initially succeed due to deferred projection equality. // unification may initially succeed due to deferred projection equality.
let projection_may_match = let projection_may_match =
|ecx: &mut EvalCtxt<'_, Infcx>, |ecx: &mut EvalCtxt<'_, D>,
source_projection: ty::Binder<I, ty::ExistentialProjection<I>>, source_projection: ty::Binder<I, ty::ExistentialProjection<I>>,
target_projection: ty::Binder<I, ty::ExistentialProjection<I>>| { target_projection: ty::Binder<I, ty::ExistentialProjection<I>>| {
source_projection.item_def_id() == target_projection.item_def_id() source_projection.item_def_id() == target_projection.item_def_id()
@ -896,7 +895,7 @@ where
// Also require that a_ty's lifetime outlives b_ty's lifetime. // Also require that a_ty's lifetime outlives b_ty's lifetime.
ecx.add_goal( ecx.add_goal(
GoalSource::ImplWhereBound, GoalSource::ImplWhereBound,
Goal::new(ecx.interner(), param_env, ty::OutlivesPredicate(a_region, b_region)), Goal::new(ecx.cx(), param_env, ty::OutlivesPredicate(a_region, b_region)),
); );
ecx.evaluate_added_goals_and_make_canonical_response(Certainty::Yes) ecx.evaluate_added_goals_and_make_canonical_response(Certainty::Yes)
@ -942,7 +941,7 @@ where
a_args: I::GenericArgs, a_args: I::GenericArgs,
b_args: I::GenericArgs, b_args: I::GenericArgs,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let tcx = self.interner(); let tcx = self.cx();
let Goal { predicate: (_a_ty, b_ty), .. } = goal; let Goal { predicate: (_a_ty, b_ty), .. } = goal;
let unsizing_params = tcx.unsizing_params_for_adt(def.def_id()); let unsizing_params = tcx.unsizing_params_for_adt(def.def_id());
@ -1002,7 +1001,7 @@ where
a_tys: I::Tys, a_tys: I::Tys,
b_tys: I::Tys, b_tys: I::Tys,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
let tcx = self.interner(); let tcx = self.cx();
let Goal { predicate: (_a_ty, b_ty), .. } = goal; let Goal { predicate: (_a_ty, b_ty), .. } = goal;
let (&a_last_ty, a_rest_tys) = a_tys.split_last().unwrap(); let (&a_last_ty, a_rest_tys) = a_tys.split_last().unwrap();
@ -1062,11 +1061,9 @@ where
// takes precedence over the structural auto trait candidate being // takes precedence over the structural auto trait candidate being
// assembled. // assembled.
ty::Coroutine(def_id, _) ty::Coroutine(def_id, _)
if self if self.cx().is_lang_item(goal.predicate.def_id(), TraitSolverLangItem::Unpin) =>
.interner()
.is_lang_item(goal.predicate.def_id(), TraitSolverLangItem::Unpin) =>
{ {
match self.interner().coroutine_movability(def_id) { match self.cx().coroutine_movability(def_id) {
Movability::Static => Some(Err(NoSolution)), Movability::Static => Some(Err(NoSolution)),
Movability::Movable => Some( Movability::Movable => Some(
self.probe_builtin_trait_candidate(BuiltinImplSource::Misc).enter(|ecx| { self.probe_builtin_trait_candidate(BuiltinImplSource::Misc).enter(|ecx| {
@ -1111,7 +1108,7 @@ where
| ty::Tuple(_) | ty::Tuple(_)
| ty::Adt(_, _) => { | ty::Adt(_, _) => {
let mut disqualifying_impl = None; let mut disqualifying_impl = None;
self.interner().for_each_relevant_impl( self.cx().for_each_relevant_impl(
goal.predicate.def_id(), goal.predicate.def_id(),
goal.predicate.self_ty(), goal.predicate.self_ty(),
|impl_def_id| { |impl_def_id| {
@ -1140,7 +1137,7 @@ where
source: CandidateSource<I>, source: CandidateSource<I>,
goal: Goal<I, TraitPredicate<I>>, goal: Goal<I, TraitPredicate<I>>,
constituent_tys: impl Fn( constituent_tys: impl Fn(
&EvalCtxt<'_, Infcx>, &EvalCtxt<'_, D>,
I::Ty, I::Ty,
) -> Result<Vec<ty::Binder<I, I::Ty>>, NoSolution>, ) -> Result<Vec<ty::Binder<I, I::Ty>>, NoSolution>,
) -> Result<Candidate<I>, NoSolution> { ) -> Result<Candidate<I>, NoSolution> {
@ -1151,10 +1148,7 @@ where
.into_iter() .into_iter()
.map(|ty| { .map(|ty| {
ecx.enter_forall(ty, |ty| { ecx.enter_forall(ty, |ty| {
goal.with( goal.with(ecx.cx(), goal.predicate.with_self_ty(ecx.cx(), ty))
ecx.interner(),
goal.predicate.with_self_ty(ecx.interner(), ty),
)
}) })
}) })
.collect::<Vec<_>>(), .collect::<Vec<_>>(),

View File

@ -214,7 +214,7 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for TransformTy<'tcx> {
} }
} }
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
} }

View File

@ -1,7 +1,7 @@
pub use rustc_next_trait_solver::solve::*; pub use rustc_next_trait_solver::solve::*;
mod delegate;
mod fulfill; mod fulfill;
mod infcx;
pub mod inspect; pub mod inspect;
mod normalize; mod normalize;
mod select; mod select;

View File

@ -39,10 +39,10 @@ impl<'tcx> Deref for SolverDelegate<'tcx> {
} }
} }
impl<'tcx> rustc_next_trait_solver::infcx::SolverDelegate for SolverDelegate<'tcx> { impl<'tcx> rustc_next_trait_solver::delegate::SolverDelegate for SolverDelegate<'tcx> {
type Interner = TyCtxt<'tcx>; type Interner = TyCtxt<'tcx>;
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.0.tcx self.0.tcx
} }

View File

@ -17,7 +17,7 @@ use rustc_span::symbol::sym;
use crate::traits::{FulfillmentError, FulfillmentErrorCode, ScrubbedTraitError}; use crate::traits::{FulfillmentError, FulfillmentErrorCode, ScrubbedTraitError};
use super::infcx::SolverDelegate; use super::delegate::SolverDelegate;
use super::inspect::{self, ProofTreeInferCtxtExt, ProofTreeVisitor}; use super::inspect::{self, ProofTreeInferCtxtExt, ProofTreeVisitor};
use super::Certainty; use super::Certainty;

View File

@ -22,7 +22,7 @@ use rustc_next_trait_solver::solve::inspect::{self, instantiate_canonical_state}
use rustc_next_trait_solver::solve::{GenerateProofTree, MaybeCause, SolverDelegateEvalExt as _}; use rustc_next_trait_solver::solve::{GenerateProofTree, MaybeCause, SolverDelegateEvalExt as _};
use rustc_span::{Span, DUMMY_SP}; use rustc_span::{Span, DUMMY_SP};
use crate::solve::infcx::SolverDelegate; use crate::solve::delegate::SolverDelegate;
use crate::traits::ObligationCtxt; use crate::traits::ObligationCtxt;
pub struct InspectConfig { pub struct InspectConfig {

View File

@ -156,7 +156,7 @@ where
{ {
type Error = Vec<E>; type Error = Vec<E>;
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.at.infcx.tcx self.at.infcx.tcx
} }
@ -244,7 +244,7 @@ struct DeeplyNormalizeForDiagnosticsFolder<'a, 'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for DeeplyNormalizeForDiagnosticsFolder<'_, 'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for DeeplyNormalizeForDiagnosticsFolder<'_, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.at.infcx.tcx self.at.infcx.tcx
} }

View File

@ -4936,7 +4936,7 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ReplaceImplTraitFolder<'tcx> {
t.super_fold_with(self) t.super_fold_with(self)
} }
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx
} }
} }

View File

@ -2840,7 +2840,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
} }
impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for ParamToVarFolder<'a, 'tcx> { impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for ParamToVarFolder<'a, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.infcx.tcx self.infcx.tcx
} }

View File

@ -350,7 +350,7 @@ pub fn normalize_param_env_or_error<'tcx>(
struct ConstNormalizer<'tcx>(TyCtxt<'tcx>); struct ConstNormalizer<'tcx>(TyCtxt<'tcx>);
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ConstNormalizer<'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ConstNormalizer<'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.0 self.0
} }

View File

@ -163,7 +163,7 @@ impl<'a, 'b, 'tcx> AssocTypeNormalizer<'a, 'b, 'tcx> {
} }
impl<'a, 'b, 'tcx> TypeFolder<TyCtxt<'tcx>> for AssocTypeNormalizer<'a, 'b, 'tcx> { impl<'a, 'b, 'tcx> TypeFolder<TyCtxt<'tcx>> for AssocTypeNormalizer<'a, 'b, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.selcx.tcx() self.selcx.tcx()
} }
@ -217,7 +217,7 @@ impl<'a, 'b, 'tcx> TypeFolder<TyCtxt<'tcx>> for AssocTypeNormalizer<'a, 'b, 'tcx
Reveal::UserFacing => ty.super_fold_with(self), Reveal::UserFacing => ty.super_fold_with(self),
Reveal::All => { Reveal::All => {
let recursion_limit = self.interner().recursion_limit(); let recursion_limit = self.cx().recursion_limit();
if !recursion_limit.value_within_limit(self.depth) { if !recursion_limit.value_within_limit(self.depth) {
self.selcx.infcx.err_ctxt().report_overflow_error( self.selcx.infcx.err_ctxt().report_overflow_error(
OverflowCause::DeeplyNormalize(data.into()), OverflowCause::DeeplyNormalize(data.into()),
@ -228,8 +228,8 @@ impl<'a, 'b, 'tcx> TypeFolder<TyCtxt<'tcx>> for AssocTypeNormalizer<'a, 'b, 'tcx
} }
let args = data.args.fold_with(self); let args = data.args.fold_with(self);
let generic_ty = self.interner().type_of(data.def_id); let generic_ty = self.cx().type_of(data.def_id);
let concrete_ty = generic_ty.instantiate(self.interner(), args); let concrete_ty = generic_ty.instantiate(self.cx(), args);
self.depth += 1; self.depth += 1;
let folded_ty = self.fold_ty(concrete_ty); let folded_ty = self.fold_ty(concrete_ty);
self.depth -= 1; self.depth -= 1;
@ -313,7 +313,7 @@ impl<'a, 'b, 'tcx> TypeFolder<TyCtxt<'tcx>> for AssocTypeNormalizer<'a, 'b, 'tcx
normalized_ty normalized_ty
} }
ty::Weak => { ty::Weak => {
let recursion_limit = self.interner().recursion_limit(); let recursion_limit = self.cx().recursion_limit();
if !recursion_limit.value_within_limit(self.depth) { if !recursion_limit.value_within_limit(self.depth) {
self.selcx.infcx.err_ctxt().report_overflow_error( self.selcx.infcx.err_ctxt().report_overflow_error(
OverflowCause::DeeplyNormalize(data.into()), OverflowCause::DeeplyNormalize(data.into()),

View File

@ -172,7 +172,7 @@ struct QueryNormalizer<'cx, 'tcx> {
impl<'cx, 'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for QueryNormalizer<'cx, 'tcx> { impl<'cx, 'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for QueryNormalizer<'cx, 'tcx> {
type Error = NoSolution; type Error = NoSolution;
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.infcx.tcx self.infcx.tcx
} }
@ -217,7 +217,7 @@ impl<'cx, 'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for QueryNormalizer<'cx, 'tcx>
Reveal::All => { Reveal::All => {
let args = data.args.try_fold_with(self)?; let args = data.args.try_fold_with(self)?;
let recursion_limit = self.interner().recursion_limit(); let recursion_limit = self.cx().recursion_limit();
if !recursion_limit.value_within_limit(self.anon_depth) { if !recursion_limit.value_within_limit(self.anon_depth) {
let guar = self let guar = self
@ -229,15 +229,15 @@ impl<'cx, 'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for QueryNormalizer<'cx, 'tcx>
true, true,
) )
.delay_as_bug(); .delay_as_bug();
return Ok(Ty::new_error(self.interner(), guar)); return Ok(Ty::new_error(self.cx(), guar));
} }
let generic_ty = self.interner().type_of(data.def_id); let generic_ty = self.cx().type_of(data.def_id);
let mut concrete_ty = generic_ty.instantiate(self.interner(), args); let mut concrete_ty = generic_ty.instantiate(self.cx(), args);
self.anon_depth += 1; self.anon_depth += 1;
if concrete_ty == ty { if concrete_ty == ty {
concrete_ty = Ty::new_error_with_message( concrete_ty = Ty::new_error_with_message(
self.interner(), self.cx(),
DUMMY_SP, DUMMY_SP,
"recursive opaque type", "recursive opaque type",
); );

View File

@ -394,7 +394,7 @@ impl<'me, 'tcx> BoundVarReplacer<'me, 'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for BoundVarReplacer<'_, 'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for BoundVarReplacer<'_, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.infcx.tcx self.infcx.tcx
} }
@ -509,7 +509,7 @@ impl<'me, 'tcx> PlaceholderReplacer<'me, 'tcx> {
} }
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for PlaceholderReplacer<'_, 'tcx> { impl<'tcx> TypeFolder<TyCtxt<'tcx>> for PlaceholderReplacer<'_, 'tcx> {
fn interner(&self) -> TyCtxt<'tcx> { fn cx(&self) -> TyCtxt<'tcx> {
self.infcx.tcx self.infcx.tcx
} }
@ -550,7 +550,7 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for PlaceholderReplacer<'_, 'tcx> {
let db = ty::DebruijnIndex::from_usize( let db = ty::DebruijnIndex::from_usize(
self.universe_indices.len() - index + self.current_index.as_usize() - 1, self.universe_indices.len() - index + self.current_index.as_usize() - 1,
); );
ty::Region::new_bound(self.interner(), db, *replace_var) ty::Region::new_bound(self.cx(), db, *replace_var)
} }
None => r1, None => r1,
} }

View File

@ -625,7 +625,7 @@ struct ArgFolder<'a, I: Interner> {
impl<'a, I: Interner> TypeFolder<I> for ArgFolder<'a, I> { impl<'a, I: Interner> TypeFolder<I> for ArgFolder<'a, I> {
#[inline] #[inline]
fn interner(&self) -> I { fn cx(&self) -> I {
self.tcx self.tcx
} }
@ -845,7 +845,7 @@ impl<'a, I: Interner> ArgFolder<'a, I> {
return val; return val;
} }
let result = ty::fold::shift_vars(TypeFolder::interner(self), val, self.binders_passed); let result = ty::fold::shift_vars(TypeFolder::cx(self), val, self.binders_passed);
debug!("shift_vars: shifted result = {:?}", result); debug!("shift_vars: shifted result = {:?}", result);
result result

View File

@ -129,7 +129,7 @@ pub trait TypeSuperFoldable<I: Interner>: TypeFoldable<I> {
/// the infallible methods of this trait to ensure that the two APIs /// the infallible methods of this trait to ensure that the two APIs
/// are coherent. /// are coherent.
pub trait TypeFolder<I: Interner>: FallibleTypeFolder<I, Error = Never> { pub trait TypeFolder<I: Interner>: FallibleTypeFolder<I, Error = Never> {
fn interner(&self) -> I; fn cx(&self) -> I;
fn fold_binder<T>(&mut self, t: ty::Binder<I, T>) -> ty::Binder<I, T> fn fold_binder<T>(&mut self, t: ty::Binder<I, T>) -> ty::Binder<I, T>
where where
@ -167,7 +167,7 @@ pub trait TypeFolder<I: Interner>: FallibleTypeFolder<I, Error = Never> {
pub trait FallibleTypeFolder<I: Interner>: Sized { pub trait FallibleTypeFolder<I: Interner>: Sized {
type Error; type Error;
fn interner(&self) -> I; fn cx(&self) -> I;
fn try_fold_binder<T>(&mut self, t: ty::Binder<I, T>) -> Result<ty::Binder<I, T>, Self::Error> fn try_fold_binder<T>(&mut self, t: ty::Binder<I, T>) -> Result<ty::Binder<I, T>, Self::Error>
where where
@ -203,8 +203,8 @@ where
{ {
type Error = Never; type Error = Never;
fn interner(&self) -> I { fn cx(&self) -> I {
TypeFolder::interner(self) TypeFolder::cx(self)
} }
fn try_fold_binder<T>(&mut self, t: ty::Binder<I, T>) -> Result<ty::Binder<I, T>, Never> fn try_fold_binder<T>(&mut self, t: ty::Binder<I, T>) -> Result<ty::Binder<I, T>, Never>
@ -351,7 +351,7 @@ impl<I: Interner> Shifter<I> {
} }
impl<I: Interner> TypeFolder<I> for Shifter<I> { impl<I: Interner> TypeFolder<I> for Shifter<I> {
fn interner(&self) -> I { fn cx(&self) -> I {
self.tcx self.tcx
} }

View File

@ -521,7 +521,7 @@ struct FoldEscapingRegions<I: Interner> {
} }
impl<I: Interner> TypeFolder<I> for FoldEscapingRegions<I> { impl<I: Interner> TypeFolder<I> for FoldEscapingRegions<I> {
fn interner(&self) -> I { fn cx(&self) -> I {
self.interner self.interner
} }