]> git.lizzy.rs Git - rust.git/commitdiff
infer: Make expected rhs type for plain assign the lhs type
authorEmil Lauridsen <mine809@gmail.com>
Sun, 10 May 2020 14:20:13 +0000 (16:20 +0200)
committerEmil Lauridsen <mine809@gmail.com>
Sun, 10 May 2020 14:24:04 +0000 (16:24 +0200)
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
crates/ra_hir_ty/src/tests/simple.rs

index 54e2bd05a19677ba08b86f84ed213081d3aaca7f..0870874fce6cd0544a9e93794ba8e81e5dfd9365 100644 (file)
@@ -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(..)
index 3820175f6c20a009c9b1a6558fb2c314a885a67a..322838f020a9f97e794c83687b73a162efc932db 100644 (file)
@@ -1787,3 +1787,32 @@ fn main() {
     "###
     )
 }
+
+#[test]
+fn infer_generic_from_later_assignment() {
+    assert_snapshot!(
+        infer(r#"
+enum Option<T> { Some(T), None }
+use Option::*;
+
+fn test() {
+    let mut end = None;
+    loop {
+        end = Some(true);
+    }
+}
+"#),
+        @r###"
+    60..130 '{     ...   } }': ()
+    70..77 'mut end': Option<bool>
+    80..84 'None': Option<bool>
+    90..128 'loop {...     }': !
+    95..128 '{     ...     }': ()
+    105..108 'end': Option<bool>
+    105..121 'end = ...(true)': ()
+    111..115 'Some': Some<bool>(bool) -> Option<bool>
+    111..121 'Some(true)': Option<bool>
+    116..120 'true': bool
+    "###
+    );
+}