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);
}
}
```
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(..)
"###
)
}
+
+#[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
+ "###
+ );
+}