Skip to content

Commit

Permalink
Auto merge of rust-lang#12409 - lowr:fix/usize-overflow, r=Veykril
Browse files Browse the repository at this point in the history
fix overflow during type inference for tuple struct patterns

The following code causes integer overflow during type inference for (malformed) tuple struct patterns.

```rust
struct S(usize);
let S(.., a, b) = S(1);
```

It has been panicking only in debug builds, and working in a way in release builds but it was inconsistent with type inference for tuple patterns:

```rust
struct S(usize);
let S(.., a, b) = S(1); // a -> unknown, b -> usize
let (.., a, b) = (1,);  // a -> usize, b -> unknown
```

With this PR, the overflow no longer happens by utilizing `saturating_sub()` like in other places and type inference for tuple struct patterns is in line with that for tuple patterns.
  • Loading branch information
bors committed May 29, 2022
2 parents 6c9fc4f + be2fa2b commit f94fa62
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
2 changes: 1 addition & 1 deletion crates/hir-ty/src/infer/pat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ impl<'a> InferenceContext<'a> {
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());
Expand Down
27 changes: 27 additions & 0 deletions crates/hir-ty/src/tests/regression.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
"#]],
);
}

0 comments on commit f94fa62

Please sign in to comment.