Skip to content

Commit cb63b02

Browse files
Implement LUB coercion of array elements
1 parent f5a100e commit cb63b02

File tree

3 files changed

+25
-11
lines changed

3 files changed

+25
-11
lines changed

crates/hir_ty/src/infer/expr.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,7 @@ impl<'a> InferenceContext<'a> {
729729
TyKind::Tuple(tys.len(), Substitution::from_iter(&Interner, tys)).intern(&Interner)
730730
}
731731
Expr::Array(array) => {
732-
let elem_ty =
732+
let mut elem_ty =
733733
match expected.to_option(&mut self.table).as_ref().map(|t| t.kind(&Interner)) {
734734
Some(TyKind::Array(st, _) | TyKind::Slice(st)) => st.clone(),
735735
_ => self.table.new_type_var(),
@@ -738,8 +738,8 @@ impl<'a> InferenceContext<'a> {
738738
let len = match array {
739739
Array::ElementList(items) => {
740740
for expr in items.iter() {
741-
// FIXME: use CoerceMany (coerce_merge_branch)
742-
self.infer_expr_coerce(*expr, &Expectation::has_type(elem_ty.clone()));
741+
let cur_elem_ty = self.infer_expr_inner(*expr, expected);
742+
elem_ty = self.coerce_merge_branch(Some(*expr), &elem_ty, &cur_elem_ty);
743743
}
744744
Some(items.len() as u64)
745745
}

crates/hir_ty/src/tests/coercion.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,3 +507,17 @@ fn main() {
507507
"#,
508508
);
509509
}
510+
511+
#[test]
512+
fn coerce_array_elems_lub() {
513+
check_no_mismatches(
514+
r#"
515+
fn f() {}
516+
fn g() {}
517+
518+
fn test() {
519+
[f, g];
520+
}
521+
"#,
522+
);
523+
}

crates/hir_ty/src/tests/regression.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -117,19 +117,19 @@ fn recursive_vars_2() {
117117
"#,
118118
expect![[r#"
119119
10..79 '{ ...x)]; }': ()
120-
20..21 'x': &{unknown}
121-
24..31 'unknown': &{unknown}
120+
20..21 'x': {unknown}
121+
24..31 'unknown': {unknown}
122122
41..42 'y': {unknown}
123123
45..52 'unknown': {unknown}
124-
58..76 '[(x, y..., &x)]': [(&{unknown}, {unknown}); 2]
125-
59..65 '(x, y)': (&{unknown}, {unknown})
126-
60..61 'x': &{unknown}
124+
58..76 '[(x, y..., &x)]': [({unknown}, {unknown}); 2]
125+
59..65 '(x, y)': ({unknown}, {unknown})
126+
60..61 'x': {unknown}
127127
63..64 'y': {unknown}
128-
67..75 '(&y, &x)': (&{unknown}, {unknown})
128+
67..75 '(&y, &x)': (&{unknown}, &{unknown})
129129
68..70 '&y': &{unknown}
130130
69..70 'y': {unknown}
131-
72..74 '&x': &&{unknown}
132-
73..74 'x': &{unknown}
131+
72..74 '&x': &{unknown}
132+
73..74 'x': {unknown}
133133
"#]],
134134
);
135135
}

0 commit comments

Comments
 (0)