File tree Expand file tree Collapse file tree 2 files changed +59
-3
lines changed Expand file tree Collapse file tree 2 files changed +59
-3
lines changed Original file line number Diff line number Diff line change @@ -651,6 +651,7 @@ impl ExprCollector<'_> {
651
651
ast:: Pat :: SlicePat ( p) => {
652
652
let SlicePatComponents { prefix, slice, suffix } = p. components ( ) ;
653
653
654
+ // FIXME properly handle `DotDotPat`
654
655
Pat :: Slice {
655
656
prefix : prefix. into_iter ( ) . map ( |p| self . collect_pat ( p) ) . collect ( ) ,
656
657
slice : slice. map ( |p| self . collect_pat ( p) ) ,
@@ -667,9 +668,15 @@ impl ExprCollector<'_> {
667
668
Pat :: Missing
668
669
}
669
670
}
670
- ast:: Pat :: DotDotPat ( _) => unreachable ! (
671
- "`DotDotPat` requires special handling and should not be mapped to a Pat."
672
- ) ,
671
+ ast:: Pat :: DotDotPat ( _) => {
672
+ // `DotDotPat` requires special handling and should not be mapped
673
+ // to a Pat. Here we are using `Pat::Missing` as a fallback for
674
+ // when `DotDotPat` is mapped to `Pat`, which can easily happen
675
+ // when the source code being analyzed has a malformed pattern
676
+ // which includes `..` in a place where it isn't valid.
677
+
678
+ Pat :: Missing
679
+ }
673
680
// FIXME: implement
674
681
ast:: Pat :: BoxPat ( _) | ast:: Pat :: RangePat ( _) | ast:: Pat :: MacroPat ( _) => Pat :: Missing ,
675
682
} ;
Original file line number Diff line number Diff line change @@ -484,3 +484,52 @@ fn main() {
484
484
485
485
assert_eq ! ( "()" , super :: type_at_pos( & db, pos) ) ;
486
486
}
487
+
488
+ #[ test]
489
+ fn issue_3999_slice ( ) {
490
+ assert_snapshot ! (
491
+ infer( r#"
492
+ fn foo(params: &[usize]) {
493
+ match params {
494
+ [ps @ .., _] => {}
495
+ }
496
+ }
497
+ "# ) ,
498
+ @r###"
499
+ [8; 14) 'params': &[usize]
500
+ [26; 81) '{ ... } }': ()
501
+ [32; 79) 'match ... }': ()
502
+ [38; 44) 'params': &[usize]
503
+ [55; 67) '[ps @ .., _]': [usize]
504
+ [65; 66) '_': usize
505
+ [71; 73) '{}': ()
506
+ "###
507
+ ) ;
508
+ }
509
+
510
+ #[ test]
511
+ fn issue_3999_struct ( ) {
512
+ // rust-analyzer should not panic on seeing this malformed
513
+ // record pattern.
514
+ assert_snapshot ! (
515
+ infer( r#"
516
+ struct Bar {
517
+ a: bool,
518
+ }
519
+ fn foo(b: Bar) {
520
+ match b {
521
+ Bar { a: .. } => {},
522
+ }
523
+ }
524
+ "# ) ,
525
+ @r###"
526
+ [36; 37) 'b': Bar
527
+ [44; 96) '{ ... } }': ()
528
+ [50; 94) 'match ... }': ()
529
+ [56; 57) 'b': Bar
530
+ [68; 81) 'Bar { a: .. }': Bar
531
+ [77; 79) '..': bool
532
+ [85; 87) '{}': ()
533
+ "###
534
+ ) ;
535
+ }
You can’t perform that action at this time.
0 commit comments