diff options
| author | bors <bors@rust-lang.org> | 2025-05-29 02:29:01 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2025-05-29 02:29:01 +0000 |
| commit | 5f025f363df11c65bd31ade9fe6f48fd4f4239af (patch) | |
| tree | 50463e14f9dddf557e2d34a5738ac3730c0e1f4e /compiler/rustc_next_trait_solver/src/resolve.rs | |
| parent | ebe9b0060240953d721508ceb4d02a745efda88f (diff) | |
| parent | 0830ce036f92673fa54a06cc4eacb47426850d33 (diff) | |
| download | rust-5f025f363df11c65bd31ade9fe6f48fd4f4239af.tar.gz rust-5f025f363df11c65bd31ade9fe6f48fd4f4239af.zip | |
Auto merge of #141581 - lcnr:fold-clauses, r=compiler-errors
add additional `TypeFlags` fast paths Some crates, e.g. `diesel`, have items with a lot of where-clauses (more than 150). In these cases checking the `TypeFlags` of the whole `param_env` can be very beneficial. This adds `fn fold_clauses` to mirror the existing `fn visit_clauses` and then uses this in folders which fold `ParamEnv`s. Split out from rust-lang/rust#141451, depends on rust-lang/rust#141442. r? `@compiler-errors`
Diffstat (limited to 'compiler/rustc_next_trait_solver/src/resolve.rs')
| -rw-r--r-- | compiler/rustc_next_trait_solver/src/resolve.rs | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/compiler/rustc_next_trait_solver/src/resolve.rs b/compiler/rustc_next_trait_solver/src/resolve.rs index 39abec2d7d8..c3c57eccd6e 100644 --- a/compiler/rustc_next_trait_solver/src/resolve.rs +++ b/compiler/rustc_next_trait_solver/src/resolve.rs @@ -11,7 +11,7 @@ use crate::delegate::SolverDelegate; // EAGER RESOLUTION /// Resolves ty, region, and const vars to their inferred values or their root vars. -pub struct EagerResolver<'a, D, I = <D as SolverDelegate>::Interner> +struct EagerResolver<'a, D, I = <D as SolverDelegate>::Interner> where D: SolverDelegate<Interner = I>, I: Interner, @@ -22,8 +22,20 @@ where cache: DelayedMap<I::Ty, I::Ty>, } +pub fn eager_resolve_vars<D: SolverDelegate, T: TypeFoldable<D::Interner>>( + delegate: &D, + value: T, +) -> T { + if value.has_infer() { + let mut folder = EagerResolver::new(delegate); + value.fold_with(&mut folder) + } else { + value + } +} + impl<'a, D: SolverDelegate> EagerResolver<'a, D> { - pub fn new(delegate: &'a D) -> Self { + fn new(delegate: &'a D) -> Self { EagerResolver { delegate, cache: Default::default() } } } @@ -90,4 +102,8 @@ impl<D: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> for EagerResolv fn fold_predicate(&mut self, p: I::Predicate) -> I::Predicate { if p.has_infer() { p.super_fold_with(self) } else { p } } + + fn fold_clauses(&mut self, c: I::Clauses) -> I::Clauses { + if c.has_infer() { c.super_fold_with(self) } else { c } + } } |
