diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs index 2f109297b55..12e0b041316 100644 --- a/crates/hir_ty/src/infer/expr.rs +++ b/crates/hir_ty/src/infer/expr.rs @@ -729,7 +729,7 @@ impl<'a> InferenceContext<'a> { TyKind::Tuple(tys.len(), Substitution::from_iter(&Interner, tys)).intern(&Interner) } Expr::Array(array) => { - let elem_ty = + let mut elem_ty = match expected.to_option(&mut self.table).as_ref().map(|t| t.kind(&Interner)) { Some(TyKind::Array(st, _) | TyKind::Slice(st)) => st.clone(), _ => self.table.new_type_var(), @@ -738,8 +738,8 @@ impl<'a> InferenceContext<'a> { let len = match array { Array::ElementList(items) => { for expr in items.iter() { - // FIXME: use CoerceMany (coerce_merge_branch) - self.infer_expr_coerce(*expr, &Expectation::has_type(elem_ty.clone())); + let cur_elem_ty = self.infer_expr_inner(*expr, expected); + elem_ty = self.coerce_merge_branch(Some(*expr), &elem_ty, &cur_elem_ty); } Some(items.len() as u64) } diff --git a/crates/hir_ty/src/tests/coercion.rs b/crates/hir_ty/src/tests/coercion.rs index 87089f09d13..6c57bf697d8 100644 --- a/crates/hir_ty/src/tests/coercion.rs +++ b/crates/hir_ty/src/tests/coercion.rs @@ -507,3 +507,17 @@ fn main() { "#, ); } + +#[test] +fn coerce_array_elems_lub() { + check_no_mismatches( + r#" +fn f() {} +fn g() {} + +fn test() { + [f, g]; +} + "#, + ); +} diff --git a/crates/hir_ty/src/tests/regression.rs b/crates/hir_ty/src/tests/regression.rs index 8c5e8954c4f..d80375f02fd 100644 --- a/crates/hir_ty/src/tests/regression.rs +++ b/crates/hir_ty/src/tests/regression.rs @@ -117,19 +117,19 @@ fn recursive_vars_2() { "#, expect![[r#" 10..79 '{ ...x)]; }': () - 20..21 'x': &{unknown} - 24..31 'unknown': &{unknown} + 20..21 'x': {unknown} + 24..31 'unknown': {unknown} 41..42 'y': {unknown} 45..52 'unknown': {unknown} - 58..76 '[(x, y..., &x)]': [(&{unknown}, {unknown}); 2] - 59..65 '(x, y)': (&{unknown}, {unknown}) - 60..61 'x': &{unknown} + 58..76 '[(x, y..., &x)]': [({unknown}, {unknown}); 2] + 59..65 '(x, y)': ({unknown}, {unknown}) + 60..61 'x': {unknown} 63..64 'y': {unknown} - 67..75 '(&y, &x)': (&{unknown}, {unknown}) + 67..75 '(&y, &x)': (&{unknown}, &{unknown}) 68..70 '&y': &{unknown} 69..70 'y': {unknown} - 72..74 '&x': &&{unknown} - 73..74 'x': &{unknown} + 72..74 '&x': &{unknown} + 73..74 'x': {unknown} "#]], ); }