diff options
| author | Michael Goulet <michael@errs.io> | 2025-05-17 19:41:06 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2025-05-18 12:18:44 +0000 |
| commit | 1d0d258a8635822b49d6cc937d895947523372fd (patch) | |
| tree | 3a35650487c586ad19ff677b9f9f71354167ad35 /compiler/rustc_trait_selection/src/solve/delegate.rs | |
| parent | 7205fc537d0fe8c3c2560b313e54fcb91ab6f3d1 (diff) | |
| download | rust-1d0d258a8635822b49d6cc937d895947523372fd.tar.gz rust-1d0d258a8635822b49d6cc937d895947523372fd.zip | |
Fast path for processing some obligations in the new solver
Diffstat (limited to 'compiler/rustc_trait_selection/src/solve/delegate.rs')
| -rw-r--r-- | compiler/rustc_trait_selection/src/solve/delegate.rs | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/compiler/rustc_trait_selection/src/solve/delegate.rs b/compiler/rustc_trait_selection/src/solve/delegate.rs index 3601c2cba9b..b6351e5e604 100644 --- a/compiler/rustc_trait_selection/src/solve/delegate.rs +++ b/compiler/rustc_trait_selection/src/solve/delegate.rs @@ -6,14 +6,15 @@ use rustc_infer::infer::canonical::query_response::make_query_region_constraints use rustc_infer::infer::canonical::{ Canonical, CanonicalExt as _, CanonicalQueryInput, CanonicalVarInfo, CanonicalVarValues, }; -use rustc_infer::infer::{InferCtxt, RegionVariableOrigin, TyCtxtInferExt}; +use rustc_infer::infer::{InferCtxt, RegionVariableOrigin, SubregionOrigin, TyCtxtInferExt}; use rustc_infer::traits::solve::Goal; use rustc_middle::traits::query::NoSolution; use rustc_middle::traits::solve::Certainty; use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable, TypeVisitableExt as _, TypingMode}; +use rustc_next_trait_solver::solve::HasChanged; use rustc_span::{DUMMY_SP, ErrorGuaranteed, Span}; -use crate::traits::{EvaluateConstErr, specialization_graph}; +use crate::traits::{EvaluateConstErr, ObligationCause, specialization_graph}; #[repr(transparent)] pub struct SolverDelegate<'tcx>(InferCtxt<'tcx>); @@ -55,6 +56,37 @@ impl<'tcx> rustc_next_trait_solver::delegate::SolverDelegate for SolverDelegate< (SolverDelegate(infcx), value, vars) } + fn compute_goal_fast_path( + &self, + goal: Goal<'tcx, ty::Predicate<'tcx>>, + span: Span, + ) -> Option<HasChanged> { + let pred = goal.predicate.kind(); + match pred.no_bound_vars()? { + ty::PredicateKind::DynCompatible(def_id) if self.0.tcx.is_dyn_compatible(def_id) => { + Some(HasChanged::No) + } + ty::PredicateKind::Clause(ty::ClauseKind::RegionOutlives(outlives)) => { + self.0.sub_regions( + SubregionOrigin::RelateRegionParamBound(span, None), + outlives.1, + outlives.0, + ); + Some(HasChanged::No) + } + ty::PredicateKind::Clause(ty::ClauseKind::TypeOutlives(outlives)) => { + self.0.register_region_obligation_with_cause( + outlives.0, + outlives.1, + &ObligationCause::dummy_with_span(span), + ); + + Some(HasChanged::No) + } + _ => None, + } + } + fn fresh_var_for_kind_with_span( &self, arg: ty::GenericArg<'tcx>, |
