Don't unify array elements with their arrays

This commit is contained in:
Laurențiu Nicola 2021-07-08 11:22:29 +03:00
parent 85f0f9eb1b
commit 3b2602cbb2
2 changed files with 21 additions and 9 deletions

View File

@ -735,10 +735,11 @@ fn infer_expr_inner(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty {
_ => self.table.new_type_var(), _ => self.table.new_type_var(),
}; };
let expected = Expectation::has_type(elem_ty.clone());
let len = match array { let len = match array {
Array::ElementList(items) => { Array::ElementList(items) => {
for expr in items.iter() { for expr in items.iter() {
let cur_elem_ty = self.infer_expr_inner(*expr, expected); let cur_elem_ty = self.infer_expr_inner(*expr, &expected);
elem_ty = self.coerce_merge_branch(Some(*expr), &elem_ty, &cur_elem_ty); elem_ty = self.coerce_merge_branch(Some(*expr), &elem_ty, &cur_elem_ty);
} }
Some(items.len() as u64) Some(items.len() as u64)

View File

@ -117,23 +117,34 @@ fn test() {
"#, "#,
expect![[r#" expect![[r#"
10..79 '{ ...x)]; }': () 10..79 '{ ...x)]; }': ()
20..21 'x': {unknown} 20..21 'x': &{unknown}
24..31 'unknown': {unknown} 24..31 'unknown': &{unknown}
41..42 'y': {unknown} 41..42 'y': {unknown}
45..52 'unknown': {unknown} 45..52 'unknown': {unknown}
58..76 '[(x, y..., &x)]': [({unknown}, {unknown}); 2] 58..76 '[(x, y..., &x)]': [(&{unknown}, {unknown}); 2]
59..65 '(x, y)': ({unknown}, {unknown}) 59..65 '(x, y)': (&{unknown}, {unknown})
60..61 'x': {unknown} 60..61 'x': &{unknown}
63..64 'y': {unknown} 63..64 'y': {unknown}
67..75 '(&y, &x)': (&{unknown}, &{unknown}) 67..75 '(&y, &x)': (&{unknown}, {unknown})
68..70 '&y': &{unknown} 68..70 '&y': &{unknown}
69..70 'y': {unknown} 69..70 'y': {unknown}
72..74 '&x': &{unknown} 72..74 '&x': &&{unknown}
73..74 'x': {unknown} 73..74 'x': &{unknown}
"#]], "#]],
); );
} }
#[test]
fn array_elements_expected_type() {
check_no_mismatches(
r#"
fn test() {
let x: [[u32; 2]; 2] = [[1, 2], [3, 4]];
}
"#,
);
}
#[test] #[test]
fn infer_std_crash_1() { fn infer_std_crash_1() {
// caused stack overflow, taken from std // caused stack overflow, taken from std