mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-07 15:37:39 +00:00
Merge #4012
4012: fix panic on ellipsis in pattern r=flodiebold a=JoshMcguigan fixes #3999 Co-authored-by: Josh Mcguigan <joshmcg88@gmail.com>
This commit is contained in:
commit
179d983535
@ -651,6 +651,7 @@ impl ExprCollector<'_> {
|
|||||||
ast::Pat::SlicePat(p) => {
|
ast::Pat::SlicePat(p) => {
|
||||||
let SlicePatComponents { prefix, slice, suffix } = p.components();
|
let SlicePatComponents { prefix, slice, suffix } = p.components();
|
||||||
|
|
||||||
|
// FIXME properly handle `DotDotPat`
|
||||||
Pat::Slice {
|
Pat::Slice {
|
||||||
prefix: prefix.into_iter().map(|p| self.collect_pat(p)).collect(),
|
prefix: prefix.into_iter().map(|p| self.collect_pat(p)).collect(),
|
||||||
slice: slice.map(|p| self.collect_pat(p)),
|
slice: slice.map(|p| self.collect_pat(p)),
|
||||||
@ -667,9 +668,15 @@ impl ExprCollector<'_> {
|
|||||||
Pat::Missing
|
Pat::Missing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast::Pat::DotDotPat(_) => unreachable!(
|
ast::Pat::DotDotPat(_) => {
|
||||||
"`DotDotPat` requires special handling and should not be mapped to a Pat."
|
// `DotDotPat` requires special handling and should not be mapped
|
||||||
),
|
// to a Pat. Here we are using `Pat::Missing` as a fallback for
|
||||||
|
// when `DotDotPat` is mapped to `Pat`, which can easily happen
|
||||||
|
// when the source code being analyzed has a malformed pattern
|
||||||
|
// which includes `..` in a place where it isn't valid.
|
||||||
|
|
||||||
|
Pat::Missing
|
||||||
|
}
|
||||||
// FIXME: implement
|
// FIXME: implement
|
||||||
ast::Pat::BoxPat(_) | ast::Pat::RangePat(_) | ast::Pat::MacroPat(_) => Pat::Missing,
|
ast::Pat::BoxPat(_) | ast::Pat::RangePat(_) | ast::Pat::MacroPat(_) => Pat::Missing,
|
||||||
};
|
};
|
||||||
|
@ -484,3 +484,52 @@ fn main() {
|
|||||||
|
|
||||||
assert_eq!("()", super::type_at_pos(&db, pos));
|
assert_eq!("()", super::type_at_pos(&db, pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn issue_3999_slice() {
|
||||||
|
assert_snapshot!(
|
||||||
|
infer(r#"
|
||||||
|
fn foo(params: &[usize]) {
|
||||||
|
match params {
|
||||||
|
[ps @ .., _] => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#),
|
||||||
|
@r###"
|
||||||
|
[8; 14) 'params': &[usize]
|
||||||
|
[26; 81) '{ ... } }': ()
|
||||||
|
[32; 79) 'match ... }': ()
|
||||||
|
[38; 44) 'params': &[usize]
|
||||||
|
[55; 67) '[ps @ .., _]': [usize]
|
||||||
|
[65; 66) '_': usize
|
||||||
|
[71; 73) '{}': ()
|
||||||
|
"###
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn issue_3999_struct() {
|
||||||
|
// rust-analyzer should not panic on seeing this malformed
|
||||||
|
// record pattern.
|
||||||
|
assert_snapshot!(
|
||||||
|
infer(r#"
|
||||||
|
struct Bar {
|
||||||
|
a: bool,
|
||||||
|
}
|
||||||
|
fn foo(b: Bar) {
|
||||||
|
match b {
|
||||||
|
Bar { a: .. } => {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#),
|
||||||
|
@r###"
|
||||||
|
[36; 37) 'b': Bar
|
||||||
|
[44; 96) '{ ... } }': ()
|
||||||
|
[50; 94) 'match ... }': ()
|
||||||
|
[56; 57) 'b': Bar
|
||||||
|
[68; 81) 'Bar { a: .. }': Bar
|
||||||
|
[77; 79) '..': bool
|
||||||
|
[85; 87) '{}': ()
|
||||||
|
"###
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user