From b7d91ca5b26c239c523b9f6096e8431b8571ff3d Mon Sep 17 00:00:00 2001 From: hkalbasi Date: Sat, 22 Jul 2023 01:06:58 +0330 Subject: [PATCH] Normalize expected ty in call arguments --- crates/hir-ty/src/infer/expr.rs | 1 + crates/hir-ty/src/tests/traits.rs | 44 +++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/crates/hir-ty/src/infer/expr.rs b/crates/hir-ty/src/infer/expr.rs index 4b14345aa3..72e6443beb 100644 --- a/crates/hir-ty/src/infer/expr.rs +++ b/crates/hir-ty/src/infer/expr.rs @@ -1665,6 +1665,7 @@ impl InferenceContext<'_> { // the parameter to coerce to the expected type (for example in // `coerce_unsize_expected_type_4`). let param_ty = self.normalize_associated_types_in(param_ty); + let expected_ty = self.normalize_associated_types_in(expected_ty); let expected = Expectation::rvalue_hint(self, expected_ty); // infer with the expected type we have... let ty = self.infer_expr_inner(arg, &expected); diff --git a/crates/hir-ty/src/tests/traits.rs b/crates/hir-ty/src/tests/traits.rs index 5f5cd79451..542df8b346 100644 --- a/crates/hir-ty/src/tests/traits.rs +++ b/crates/hir-ty/src/tests/traits.rs @@ -4434,3 +4434,47 @@ fn test(v: S) { "#, ); } + +#[test] +fn associated_type_in_argument() { + check( + r#" + trait A { + fn m(&self) -> i32; + } + + fn x(k: &::Ty) { + k.m(); + } + + struct X; + struct Y; + + impl A for X { + fn m(&self) -> i32 { + 8 + } + } + + impl A for Y { + fn m(&self) -> i32 { + 32 + } + } + + trait B { + type Ty: A; + } + + impl B for u16 { + type Ty = X; + } + + fn ttt() { + let inp = Y; + x::(&inp); + //^^^^ expected &X, got &Y + } + "#, + ); +}