Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22939 from ada4a/push-kmnplvwwunpy
internal: update next-solver to 0.166
| -rw-r--r-- | Cargo.lock | 44 | ||||
| -rw-r--r-- | Cargo.toml | 16 | ||||
| -rw-r--r-- | crates/hir-ty/src/method_resolution.rs | 45 | ||||
| -rw-r--r-- | crates/hir-ty/src/next_solver/interner.rs | 37 | ||||
| -rw-r--r-- | crates/hir-ty/src/next_solver/util.rs | 12 |
5 files changed, 95 insertions, 59 deletions
diff --git a/Cargo.lock b/Cargo.lock index a096be2f2a..7a2e2d493b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2062,9 +2062,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "ra-ap-rustc_abi" -version = "0.165.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f25a779e21ca3bba6795193b16508c8ab159f96ee4b07349893fd272065b525" +checksum = "e2cf1b1ffe31b6226c00b40cddfda65002b7729f9f4ed2d547b5856cdab0011c" dependencies = [ "bitflags", "ra-ap-rustc_hashes", @@ -2074,33 +2074,33 @@ dependencies = [ [[package]] name = "ra-ap-rustc_ast_ir" -version = "0.165.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0218ca6c7b096466e85a497e6150c39be5b7bc36637fe62c1cd20370a9d9aac7" +checksum = "2ef42605e36e1305e815ccfc8830eb870f74d78534bca19a61629149536d8e98" [[package]] name = "ra-ap-rustc_hashes" -version = "0.165.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b410bacf1a7c8038f376fa6283003784d568ac012e35fc0aeefa9a5ab11a2e" +checksum = "b9f5542968215c17275920791b2fa13a43014287506ed0450777c79845102e86" dependencies = [ "rustc-stable-hash", ] [[package]] name = "ra-ap-rustc_index" -version = "0.165.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2271b55e4a5d0cc0cbe9bdf8056c07ac69e32919a48ce66722ed0526d62588c3" +checksum = "1d9e47b9ca7d92cfb0d6653503adbabd41938b84474317397a664326b208d6c6" dependencies = [ "ra-ap-rustc_index_macros", ] [[package]] name = "ra-ap-rustc_index_macros" -version = "0.165.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a89e743fb881a1e13544e3395a5ad9ad9280d56384256a121066119abd7af2" +checksum = "4d744a7a2852a22f06210bcff9e4667ed0cacbfbe94894cc294044d25e876341" dependencies = [ "proc-macro2", "quote", @@ -2109,9 +2109,9 @@ dependencies = [ [[package]] name = "ra-ap-rustc_lexer" -version = "0.165.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6d7c9cc05e0e6b72a214a455a106d9b22b0494164d50a657b17bd319534c218" +checksum = "527c12b3731b7d0692498012810b85b2b8dfdb8b514321ed6afc434bd1c70191" dependencies = [ "memchr", "unicode-ident", @@ -2120,9 +2120,9 @@ dependencies = [ [[package]] name = "ra-ap-rustc_next_trait_solver" -version = "0.165.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3017c2f0ace80b8e6068b9c613aa56ed50e0374bf44a891447511f1264e40d" +checksum = "a7a9663a8d7c369e934aac2b74a638537ad7eb4be75b4530d765384dc071c936" dependencies = [ "derive-where", "ra-ap-rustc_index", @@ -2133,9 +2133,9 @@ dependencies = [ [[package]] name = "ra-ap-rustc_parse_format" -version = "0.165.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a737f844bdef8ac5ab54dadf2f34704b4d06beef9236d71080bb34db697220b" +checksum = "2c038b7a8b0f784d4e441ad8ab991fbbdaa5e0be482e59c639a846a1c8126951" dependencies = [ "ra-ap-rustc_lexer", "rustc-literal-escaper", @@ -2143,9 +2143,9 @@ dependencies = [ [[package]] name = "ra-ap-rustc_pattern_analysis" -version = "0.165.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6de3d4c7d6078cce3c40c55717b8b15002a80b9fa8849faea496a365324861b4" +checksum = "42ca286f90e99bb97cd9274c088f3c874a05d1ee90cabf40a3928afedabe99fd" dependencies = [ "ra-ap-rustc_index", "rustc-hash 2.1.2", @@ -2156,9 +2156,9 @@ dependencies = [ [[package]] name = "ra-ap-rustc_type_ir" -version = "0.165.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c5d9a4d3e7bee7313599bc6d794037247ac0165f03857379cf4fc3097199e05" +checksum = "26d6efb6008f665a9485e0afecf9f4950a6c4bedd8ddd330a9df8986a6c0160b" dependencies = [ "arrayvec", "bitflags", @@ -2177,9 +2177,9 @@ dependencies = [ [[package]] name = "ra-ap-rustc_type_ir_macros" -version = "0.165.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "024598d1f54272acd83d28c121f8a2e82e216dd7be1e40158b66b2d12fa214c0" +checksum = "5f4fd2355e2bbf1f343c730f623596efc6e465b5e3685b606a437567ebb75bf8" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 2a219c3ea4..4ef92c5bd2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -86,14 +86,14 @@ vfs-notify = { path = "./crates/vfs-notify", version = "0.0.0" } vfs = { path = "./crates/vfs", version = "0.0.0" } edition = { path = "./crates/edition", version = "0.0.0" } -ra-ap-rustc_lexer = { version = "0.165", default-features = false } -ra-ap-rustc_parse_format = { version = "0.165", default-features = false } -ra-ap-rustc_index = { version = "0.165", default-features = false } -ra-ap-rustc_abi = { version = "0.165", default-features = false } -ra-ap-rustc_pattern_analysis = { version = "0.165", default-features = false } -ra-ap-rustc_ast_ir = { version = "0.165", default-features = false } -ra-ap-rustc_type_ir = { version = "0.165", default-features = false } -ra-ap-rustc_next_trait_solver = { version = "0.165", default-features = false } +ra-ap-rustc_lexer = { version = "0.166", default-features = false } +ra-ap-rustc_parse_format = { version = "0.166", default-features = false } +ra-ap-rustc_index = { version = "0.166", default-features = false } +ra-ap-rustc_abi = { version = "0.166", default-features = false } +ra-ap-rustc_pattern_analysis = { version = "0.166", default-features = false } +ra-ap-rustc_ast_ir = { version = "0.166", default-features = false } +ra-ap-rustc_type_ir = { version = "0.166", default-features = false } +ra-ap-rustc_next_trait_solver = { version = "0.166", default-features = false } # local crates that aren't published to crates.io. These should not have versions. diff --git a/crates/hir-ty/src/method_resolution.rs b/crates/hir-ty/src/method_resolution.rs index e8702bf2c9..97e9d8bae1 100644 --- a/crates/hir-ty/src/method_resolution.rs +++ b/crates/hir-ty/src/method_resolution.rs @@ -31,7 +31,7 @@ use hir_def::{ }; use rustc_hash::{FxHashMap, FxHashSet}; use rustc_type_ir::{ - TypeVisitableExt, + TypeVisitableExt, VisitorResult, fast_reject::{TreatParams, simplify_type}, inherent::{BoundExistentialPredicates, IntoKind}, }; @@ -54,6 +54,7 @@ use crate::{ obligation_ctxt::ObligationCtxt, util::clauses_as_obligations, }, + ret, traits::ParamEnvAndCrate, }; @@ -835,27 +836,34 @@ impl<'db> TraitImpls<'db> { } } - pub fn for_each_crate_and_block( + pub fn for_each_crate_and_block<R: VisitorResult>( db: &'db dyn HirDatabase, krate: Crate, block: Option<BlockIdLt<'db>>, - for_each: &mut dyn FnMut(&TraitImpls<'db>), - ) { + for_each: &mut dyn FnMut(&TraitImpls<'db>) -> R, + ) -> R { let blocks = std::iter::successors(block, |block| block.module(db).block(db)); - blocks.filter_map(|block| Self::for_block(db, block)).for_each(&mut *for_each); - Self::for_crate_and_deps(db, krate).iter().map(|it| &**it).for_each(for_each); + for impl_ in blocks.filter_map(|block| Self::for_block(db, block)) { + ret!(for_each(impl_)); + } + for impl_ in Self::for_crate_and_deps(db, krate) { + ret!(for_each(impl_)); + } + R::output() } /// Like [`Self::for_each_crate_and_block()`], but takes in account two blocks, one for a trait and one for a self type. - pub fn for_each_crate_and_block_trait_and_type( + pub fn for_each_crate_and_block_trait_and_type<R: VisitorResult>( db: &'db dyn HirDatabase, krate: Crate, type_block: Option<BlockIdLt<'db>>, trait_block: Option<BlockIdLt<'db>>, - for_each: &mut dyn FnMut(&TraitImpls<'db>), - ) { + for_each: &mut dyn FnMut(&TraitImpls<'db>) -> R, + ) -> R { let in_self_and_deps = TraitImpls::for_crate_and_deps(db, krate); - in_self_and_deps.iter().for_each(|impls| for_each(impls)); + for impl_ in in_self_and_deps { + ret!(for_each(impl_)); + } // We must not provide duplicate impls to the solver. Therefore we work with the following strategy: // start from each block, and walk ancestors until you meet the other block. If they never meet, @@ -874,13 +882,20 @@ impl<'db> TraitImpls<'db> { .filter_map(move |block| TraitImpls::for_block(db, block)) }; if trait_block == type_block { - blocks_iter(trait_block) - .filter_map(|block| TraitImpls::for_block(db, block)) - .for_each(for_each); + for impl_ in + blocks_iter(trait_block).filter_map(|block| TraitImpls::for_block(db, block)) + { + ret!(for_each(impl_)); + } } else { - for_each_block(trait_block, type_block).for_each(&mut *for_each); - for_each_block(type_block, trait_block).for_each(for_each); + for impl_ in for_each_block(trait_block, type_block) { + ret!(for_each(impl_)); + } + for impl_ in for_each_block(type_block, trait_block) { + ret!(for_each(impl_)); + } } + R::output() } } diff --git a/crates/hir-ty/src/next_solver/interner.rs b/crates/hir-ty/src/next_solver/interner.rs index a7216a034c..dc30c1e582 100644 --- a/crates/hir-ty/src/next_solver/interner.rs +++ b/crates/hir-ty/src/next_solver/interner.rs @@ -29,7 +29,7 @@ use rustc_index::bit_set::DenseBitSet; use rustc_type_ir::{ AliasTy, BoundVar, CoroutineWitnessTypes, DebruijnIndex, EarlyBinder, FlagComputation, Flags, FnSigKind, GenericArgKind, GenericTypeVisitable, ImplPolarity, InferTy, Interner, TraitRef, - TypeFlags, TypeVisitableExt, Upcast, Variance, + TypeFlags, TypeVisitableExt, Upcast, Variance, VisitorResult, elaborate::elaborate, error::TypeError, fast_reject, @@ -54,6 +54,7 @@ use crate::{ TraitAssocTyId, TraitIdWrapper, TypeAliasIdWrapper, UnevaluatedConst, Unnormalized, util::{explicit_item_bounds, explicit_item_self_bounds}, }, + ret, }; use super::{ @@ -1601,12 +1602,12 @@ impl<'db> Interner for DbInterner<'db> { def_id.0.trait_items(self.db()).associated_types().map(|id| id.into()) } - fn for_each_relevant_impl( + fn for_each_relevant_impl<R: VisitorResult>( self, trait_def_id: Self::TraitId, self_ty: Self::Ty, - mut f: impl FnMut(Self::ImplId), - ) { + mut f: impl FnMut(Self::ImplId) -> R, + ) -> R { let krate = self.krate.expect("trait solving requires setting `DbInterner::krate`"); let trait_block = trait_def_id.0.loc(self.db).container.block(self.db); let mut consider_impls_for_simplified_type = |simp: SimplifiedType<'_>| { @@ -1641,13 +1642,14 @@ impl<'db> Interner for DbInterner<'db> { let (regular_impls, builtin_derive_impls) = impls.for_trait_and_self_ty(trait_def_id.0, &simp); for &impl_ in regular_impls { - f(impl_.into()); + ret!(f(impl_.into())); } for &impl_ in builtin_derive_impls { - f(impl_.into()); + ret!(f(impl_.into())); } + R::output() }, - ); + ) }; match self_ty.kind() { @@ -1676,7 +1678,7 @@ impl<'db> Interner for DbInterner<'db> { let simp = fast_reject::simplify_type(self, self_ty, fast_reject::TreatParams::AsRigid) .unwrap(); - consider_impls_for_simplified_type(simp); + ret!(consider_impls_for_simplified_type(simp)); } // HACK: For integer and float variables we have to manually look at all impls @@ -1704,7 +1706,7 @@ impl<'db> Interner for DbInterner<'db> { SimplifiedType::Uint(Usize), ]; for simp in possible_integers { - consider_impls_for_simplified_type(simp); + ret!(consider_impls_for_simplified_type(simp)); } } @@ -1719,7 +1721,7 @@ impl<'db> Interner for DbInterner<'db> { ]; for simp in possible_floats { - consider_impls_for_simplified_type(simp); + ret!(consider_impls_for_simplified_type(simp)); } } @@ -1748,15 +1750,22 @@ impl<'db> Interner for DbInterner<'db> { self.for_each_blanket_impl(trait_def_id, f) } - fn for_each_blanket_impl(self, trait_def_id: Self::TraitId, mut f: impl FnMut(Self::ImplId)) { - let Some(krate) = self.krate else { return }; + fn for_each_blanket_impl<R: VisitorResult>( + self, + trait_def_id: Self::TraitId, + mut f: impl FnMut(Self::ImplId) -> R, + ) -> R { + let Some(krate) = self.krate else { + return R::output(); + }; let block = trait_def_id.0.loc(self.db).container.block(self.db); TraitImpls::for_each_crate_and_block(self.db, krate, block, &mut |impls| { for &impl_ in impls.blanket_impls(trait_def_id.0) { - f(impl_.into()); + ret!(f(impl_.into())); } - }); + R::output() + }) } fn has_item_definition(self, _def_id: Self::ImplOrTraitAssocTermId) -> bool { diff --git a/crates/hir-ty/src/next_solver/util.rs b/crates/hir-ty/src/next_solver/util.rs index 7e40e3c17d..e384ac4552 100644 --- a/crates/hir-ty/src/next_solver/util.rs +++ b/crates/hir-ty/src/next_solver/util.rs @@ -723,3 +723,15 @@ pub(crate) fn clauses_as_obligations<'db>( recursion_depth: 0, }) } + +/// Copied from +/// <https://github.com/jdonszelmann/rust/blob/180725cff61d00dd1b9c35fc720a8befaec5d46b/compiler/rustc_middle/src/ty/context/impl_interner.rs#L534-L541> +#[macro_export] +macro_rules! ret { + ($e: expr) => { + match $e.branch() { + ::std::ops::ControlFlow::Break(b) => return R::from_residual(b), + ::std::ops::ControlFlow::Continue(()) => {} + } + }; +} |