about summary refs log tree commit diff
diff options
context:
space:
mode:
authorShoyu Vanilla (Flint) <modulo641@gmail.com>2025-08-26 05:31:07 +0000
committerGitHub <noreply@github.com>2025-08-26 05:31:07 +0000
commit05a61993a20479083b5fca9adaf8d5f7f7e776bf (patch)
tree6bff15f8dab7ceabd9b29012ad22d485a87b7ece
parent69c25d1fec171821865a712738d2bffaa1cb576d (diff)
parent4b5bb18c57270a5b823235397067ae82c64bf1f1 (diff)
downloadrust-05a61993a20479083b5fca9adaf8d5f7f7e776bf.tar.gz
rust-05a61993a20479083b5fca9adaf8d5f7f7e776bf.zip
Merge pull request #20537 from ChayimFriedman2/new-solver-normalize
fix: Normalize all types when finishing inference
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/infer/unify.rs3
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/next_solver/mapping.rs22
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/tests/regression/new_solver.rs26
3 files changed, 45 insertions, 6 deletions
diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/infer/unify.rs b/src/tools/rust-analyzer/crates/hir-ty/src/infer/unify.rs
index a709aebfa9c..bb4782bd419 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/infer/unify.rs
+++ b/src/tools/rust-analyzer/crates/hir-ty/src/infer/unify.rs
@@ -621,6 +621,9 @@ impl<'a> InferenceTable<'a> {
     where
         T: HasInterner<Interner = Interner> + TypeFoldable<Interner>,
     {
+        let t = self.resolve_with_fallback(t, &|_, _, d, _| d);
+        let t = self.normalize_associated_types_in(t);
+        // Resolve again, because maybe normalization inserted infer vars.
         self.resolve_with_fallback(t, &|_, _, d, _| d)
     }
 
diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/next_solver/mapping.rs b/src/tools/rust-analyzer/crates/hir-ty/src/next_solver/mapping.rs
index cad51fd85f5..8f6296b1454 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/next_solver/mapping.rs
+++ b/src/tools/rust-analyzer/crates/hir-ty/src/next_solver/mapping.rs
@@ -808,14 +808,24 @@ impl<'db> ChalkToNextSolver<'db, PredicateKind<'db>> for chalk_ir::DomainGoal<In
                     _ => unimplemented!(),
                 };
                 let args: GenericArgs<'db> = proj_ty.substitution.to_nextsolver(interner);
-                let alias = rustc_type_ir::AliasTerm::new(
+                let alias = Ty::new(
                     interner,
-                    from_assoc_type_id(proj_ty.associated_ty_id).into(),
-                    args,
-                );
+                    rustc_type_ir::TyKind::Alias(
+                        rustc_type_ir::AliasTyKind::Projection,
+                        rustc_type_ir::AliasTy::new(
+                            interner,
+                            from_assoc_type_id(proj_ty.associated_ty_id).into(),
+                            args,
+                        ),
+                    ),
+                )
+                .into();
                 let term = normalize.ty.to_nextsolver(interner).into();
-                let normalizes_to = rustc_type_ir::NormalizesTo { alias, term };
-                PredicateKind::NormalizesTo(normalizes_to)
+                PredicateKind::AliasRelate(
+                    alias,
+                    term,
+                    rustc_type_ir::AliasRelationDirection::Equate,
+                )
             }
             chalk_ir::DomainGoal::WellFormed(well_formed) => {
                 let term = match well_formed {
diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression/new_solver.rs b/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression/new_solver.rs
index 059f4ad32a5..20190fbc045 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression/new_solver.rs
+++ b/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression/new_solver.rs
@@ -24,3 +24,29 @@ impl<'a> IntoIterator for &'a Grid {
         "#]],
     );
 }
+
+#[test]
+fn normalization() {
+    check_infer(
+        r#"
+//- minicore: iterator, iterators
+fn main() {
+    _ = [0i32].into_iter().filter_map(|_n| Some(1i32));
+}
+    "#,
+        expect![[r#"
+            10..69 '{     ...2)); }': ()
+            16..17 '_': FilterMap<IntoIter<i32, 1>, impl FnMut(i32) -> Option<i32>>
+            16..66 '_ = [0...1i32))': ()
+            20..26 '[0i32]': [i32; 1]
+            20..38 '[0i32]...iter()': IntoIter<i32, 1>
+            20..66 '[0i32]...1i32))': FilterMap<IntoIter<i32, 1>, impl FnMut(i32) -> Option<i32>>
+            21..25 '0i32': i32
+            50..65 '|_n| Some(1i32)': impl FnMut(i32) -> Option<i32>
+            51..53 '_n': i32
+            55..59 'Some': fn Some<i32>(i32) -> Option<i32>
+            55..65 'Some(1i32)': Option<i32>
+            60..64 '1i32': i32
+        "#]],
+    );
+}