diff options
| author | Boxy <rust@boxyuwu.dev> | 2024-11-12 02:54:03 +0000 | 
|---|---|---|
| committer | Boxy <rust@boxyuwu.dev> | 2024-11-12 02:54:03 +0000 | 
| commit | bea0148ac62758a99dcc2ac2cc2efedacb8881bf (patch) | |
| tree | 1e3cf15272da0fb53f45fc9521b626509467af14 /compiler/rustc_trait_selection/src/solve/delegate.rs | |
| parent | 81eef2d362a6f03db6f8928f82d94298d31eb81b (diff) | |
| download | rust-bea0148ac62758a99dcc2ac2cc2efedacb8881bf.tar.gz rust-bea0148ac62758a99dcc2ac2cc2efedacb8881bf.zip | |
Consolidate type system const evaluation under `traits::evaluate_const`
mew
Diffstat (limited to 'compiler/rustc_trait_selection/src/solve/delegate.rs')
| -rw-r--r-- | compiler/rustc_trait_selection/src/solve/delegate.rs | 23 | 
1 files changed, 11 insertions, 12 deletions
| diff --git a/compiler/rustc_trait_selection/src/solve/delegate.rs b/compiler/rustc_trait_selection/src/solve/delegate.rs index c53689b211d..2cc787c8bc5 100644 --- a/compiler/rustc_trait_selection/src/solve/delegate.rs +++ b/compiler/rustc_trait_selection/src/solve/delegate.rs @@ -15,7 +15,7 @@ use rustc_span::{DUMMY_SP, ErrorGuaranteed, Span}; use rustc_type_ir::TypingMode; use rustc_type_ir::solve::{Certainty, NoSolution}; -use crate::traits::specialization_graph; +use crate::traits::{EvaluateConstErr, specialization_graph}; #[repr(transparent)] pub struct SolverDelegate<'tcx>(InferCtxt<'tcx>); @@ -77,20 +77,19 @@ impl<'tcx> rustc_next_trait_solver::delegate::SolverDelegate for SolverDelegate< self.0.leak_check(max_input_universe, None).map_err(|_| NoSolution) } - fn try_const_eval_resolve( + fn evaluate_const( &self, param_env: ty::ParamEnv<'tcx>, - unevaluated: ty::UnevaluatedConst<'tcx>, + uv: ty::UnevaluatedConst<'tcx>, ) -> Option<ty::Const<'tcx>> { - use rustc_middle::mir::interpret::ErrorHandled; - match self.const_eval_resolve(param_env, unevaluated, DUMMY_SP) { - Ok(Ok(val)) => Some(ty::Const::new_value( - self.tcx, - val, - self.tcx.type_of(unevaluated.def).instantiate(self.tcx, unevaluated.args), - )), - Ok(Err(_)) | Err(ErrorHandled::TooGeneric(_)) => None, - Err(ErrorHandled::Reported(e, _)) => Some(ty::Const::new_error(self.tcx, e.into())), + let ct = ty::Const::new_unevaluated(self.tcx, uv); + + match crate::traits::try_evaluate_const(&self.0, ct, param_env) { + Ok(ct) => Some(ct), + Err(EvaluateConstErr::EvaluationFailure(e)) => Some(ty::Const::new_error(self.tcx, e)), + Err( + EvaluateConstErr::InvalidConstParamTy(_) | EvaluateConstErr::HasGenericsOrInfers, + ) => None, } } | 
