fix overflow during tuple struct type inference

This commit is contained in:
Ryo Yoshida 2022-05-29 16:20:44 +09:00
parent 6c9fc4fec2
commit be2fa2b31b
No known key found for this signature in database
GPG key ID: E25698A930586171
2 changed files with 28 additions and 1 deletions

View file

@ -42,7 +42,7 @@ fn infer_tuple_struct_pat(
Some(idx) => subpats.split_at(idx),
None => (subpats, &[][..]),
};
let post_idx_offset = field_tys.iter().count() - post.len();
let post_idx_offset = field_tys.iter().count().saturating_sub(post.len());
let pre_iter = pre.iter().enumerate();
let post_iter = (post_idx_offset..).zip(post.iter());

View file

@ -1620,3 +1620,30 @@ pub trait Destruct {}
"#,
);
}
#[test]
fn tuple_struct_pattern_with_unmatched_args_crash() {
check_infer(
r#"
struct S(usize);
fn main() {
let S(.., a, b) = S(1);
let (.., a, b) = (1,);
}
"#,
expect![[r#"
27..85 '{ ...1,); }': ()
37..48 'S(.., a, b)': S
43..44 'a': usize
46..47 'b': {unknown}
51..52 'S': S(usize) -> S
51..55 'S(1)': S
53..54 '1': usize
65..75 '(.., a, b)': (i32, {unknown})
70..71 'a': i32
73..74 'b': {unknown}
78..82 '(1,)': (i32,)
79..80 '1': i32
"#]],
);
}