Unnamed repository; edit this file 'description' to name the repository.
fix: Fix type argument mismatch incorrectly triggering on inferred trait args
Lukas Wirth 2025-04-24
parent 8fb2dcc · commit dce59ad
-rw-r--r--crates/hir-ty/src/infer/path.rs2
-rw-r--r--crates/hir-ty/src/lower.rs2
-rw-r--r--crates/hir-ty/src/lower/path.rs7
-rw-r--r--crates/ide-diagnostics/src/handlers/incorrect_generics_len.rs12
4 files changed, 19 insertions, 4 deletions
diff --git a/crates/hir-ty/src/infer/path.rs b/crates/hir-ty/src/infer/path.rs
index bdaec615ac..88638d1ae9 100644
--- a/crates/hir-ty/src/infer/path.rs
+++ b/crates/hir-ty/src/infer/path.rs
@@ -207,7 +207,7 @@ impl InferenceContext<'_> {
(TypeNs::TraitId(trait_), true) => {
let self_ty = self.table.new_type_var();
let trait_ref =
- path_ctx.lower_trait_ref_from_resolved_path(trait_, self_ty);
+ path_ctx.lower_trait_ref_from_resolved_path(trait_, self_ty, true);
drop_ctx(ctx, no_diagnostics);
self.resolve_trait_assoc_item(trait_ref, last_segment, id)
}
diff --git a/crates/hir-ty/src/lower.rs b/crates/hir-ty/src/lower.rs
index eecca32240..740882521c 100644
--- a/crates/hir-ty/src/lower.rs
+++ b/crates/hir-ty/src/lower.rs
@@ -538,7 +538,7 @@ impl<'a> TyLoweringContext<'a> {
TypeNs::TraitId(tr) => tr,
_ => return None,
};
- Some((ctx.lower_trait_ref_from_resolved_path(resolved, explicit_self_ty), ctx))
+ Some((ctx.lower_trait_ref_from_resolved_path(resolved, explicit_self_ty, false), ctx))
}
fn lower_trait_ref(
diff --git a/crates/hir-ty/src/lower/path.rs b/crates/hir-ty/src/lower/path.rs
index d3ca438d6e..6b71e98b03 100644
--- a/crates/hir-ty/src/lower/path.rs
+++ b/crates/hir-ty/src/lower/path.rs
@@ -166,6 +166,7 @@ impl<'a, 'b> PathLoweringContext<'a, 'b> {
let trait_ref = self.lower_trait_ref_from_resolved_path(
trait_,
TyKind::Error.intern(Interner),
+ infer_args,
);
self.skip_resolved_segment();
@@ -830,8 +831,9 @@ impl<'a, 'b> PathLoweringContext<'a, 'b> {
&mut self,
resolved: TraitId,
explicit_self_ty: Ty,
+ infer_args: bool,
) -> TraitRef {
- let substs = self.trait_ref_substs_from_path(resolved, explicit_self_ty);
+ let substs = self.trait_ref_substs_from_path(resolved, explicit_self_ty, infer_args);
TraitRef { trait_id: to_chalk_trait_id(resolved), substitution: substs }
}
@@ -839,8 +841,9 @@ impl<'a, 'b> PathLoweringContext<'a, 'b> {
&mut self,
resolved: TraitId,
explicit_self_ty: Ty,
+ infer_args: bool,
) -> Substitution {
- self.substs_from_path_segment(resolved.into(), false, Some(explicit_self_ty), false)
+ self.substs_from_path_segment(resolved.into(), infer_args, Some(explicit_self_ty), false)
}
pub(super) fn assoc_type_bindings_from_type_bound<'c>(
diff --git a/crates/ide-diagnostics/src/handlers/incorrect_generics_len.rs b/crates/ide-diagnostics/src/handlers/incorrect_generics_len.rs
index 8244f303d9..17c7f75880 100644
--- a/crates/ide-diagnostics/src/handlers/incorrect_generics_len.rs
+++ b/crates/ide-diagnostics/src/handlers/incorrect_generics_len.rs
@@ -172,4 +172,16 @@ fn foo<T: Trait<Assoc<i32> = bool>>() {}
"#,
);
}
+
+ #[test]
+ fn regression_19669() {
+ check_diagnostics(
+ r#"
+//- minicore: from
+fn main() {
+ let _: i32 = Into::into(0);
+}
+"#,
+ );
+ }
}