From 85d44cad45761a55741ff406e23f2e40b0f24b88 Mon Sep 17 00:00:00 2001 From: Emil Lauridsen Date: Sun, 10 May 2020 16:20:13 +0200 Subject: infer: Make expected rhs type for plain assign the lhs type This fixes an issue where the following code sample would fail to infer the type contained in the option: ```rust fn main() { let mut end = None; // TODO: Fix inference for this in RA loop { end = Some(true); } } ``` --- crates/ra_hir_ty/src/op.rs | 3 ++- crates/ra_hir_ty/src/tests/simple.rs | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) (limited to 'crates/ra_hir_ty/src') diff --git a/crates/ra_hir_ty/src/op.rs b/crates/ra_hir_ty/src/op.rs index 54e2bd05a..0870874fc 100644 --- a/crates/ra_hir_ty/src/op.rs +++ b/crates/ra_hir_ty/src/op.rs @@ -30,7 +30,8 @@ pub(super) fn binary_op_return_ty(op: BinaryOp, lhs_ty: Ty, rhs_ty: Ty) -> Ty { pub(super) fn binary_op_rhs_expectation(op: BinaryOp, lhs_ty: Ty) -> Ty { match op { BinaryOp::LogicOp(..) => Ty::simple(TypeCtor::Bool), - BinaryOp::Assignment { op: None } | BinaryOp::CmpOp(CmpOp::Eq { .. }) => match lhs_ty { + BinaryOp::Assignment { op: None } => lhs_ty, + BinaryOp::CmpOp(CmpOp::Eq { .. }) => match lhs_ty { Ty::Apply(ApplicationTy { ctor, .. }) => match ctor { TypeCtor::Int(..) | TypeCtor::Float(..) diff --git a/crates/ra_hir_ty/src/tests/simple.rs b/crates/ra_hir_ty/src/tests/simple.rs index 3820175f6..322838f02 100644 --- a/crates/ra_hir_ty/src/tests/simple.rs +++ b/crates/ra_hir_ty/src/tests/simple.rs @@ -1787,3 +1787,32 @@ fn main() { "### ) } + +#[test] +fn infer_generic_from_later_assignment() { + assert_snapshot!( + infer(r#" +enum Option { Some(T), None } +use Option::*; + +fn test() { + let mut end = None; + loop { + end = Some(true); + } +} +"#), + @r###" + 60..130 '{ ... } }': () + 70..77 'mut end': Option + 80..84 'None': Option + 90..128 'loop {... }': ! + 95..128 '{ ... }': () + 105..108 'end': Option + 105..121 'end = ...(true)': () + 111..115 'Some': Some(bool) -> Option + 111..121 'Some(true)': Option + 116..120 'true': bool + "### + ); +} -- cgit v1.2.3