@@ -632,9 +632,9 @@ pub fn check_pat(pcx: &pat_ctxt, pat: &ast::Pat, expected: ty::t) {
632
632
fcx. infcx ( ) . next_region_var (
633
633
infer:: PatternRegion ( pat. span ) ) ;
634
634
635
- let check_err = || {
636
- for elt in before. iter ( ) {
637
- check_pat ( pcx, & * * elt, ty:: mk_err ( ) ) ;
635
+ let check_err = |found : String | {
636
+ for & elt in before. iter ( ) {
637
+ check_pat ( pcx, & * elt, ty:: mk_err ( ) ) ;
638
638
}
639
639
for elt in slice. iter ( ) {
640
640
check_pat ( pcx, & * * elt, ty:: mk_err ( ) ) ;
@@ -653,15 +653,16 @@ pub fn check_pat(pcx: &pat_ctxt, pat: &ast::Pat, expected: ty::t) {
653
653
} )
654
654
} ,
655
655
Some ( expected) ,
656
- "a vector pattern" . to_string ( ) ,
656
+ found ,
657
657
None ) ;
658
658
fcx. write_error ( pat. id ) ;
659
659
} ;
660
660
661
- let ( elt_type, region_var, mutbl) = match * structure_of ( fcx,
661
+ let ( elt_type, region_var, mutbl, fixed ) = match * structure_of ( fcx,
662
662
pat. span ,
663
663
expected) {
664
- ty:: ty_vec( mt, Some ( _) ) => ( mt. ty , default_region_var, ast:: MutImmutable ) ,
664
+ ty:: ty_vec( mt, Some ( fixed) ) =>
665
+ ( mt. ty , default_region_var, ast:: MutImmutable , Some ( fixed) ) ,
665
666
ty:: ty_uniq( t) => match ty:: get ( t) . sty {
666
667
ty:: ty_vec( mt, None ) => {
667
668
fcx. type_error_message ( pat. span ,
@@ -671,25 +672,40 @@ pub fn check_pat(pcx: &pat_ctxt, pat: &ast::Pat, expected: ty::t) {
671
672
} ,
672
673
expected,
673
674
None ) ;
674
- ( mt. ty , default_region_var, ast:: MutImmutable )
675
+ ( mt. ty , default_region_var, ast:: MutImmutable , None )
675
676
}
676
677
_ => {
677
- check_err ( ) ;
678
+ check_err ( "a vector pattern" . to_string ( ) ) ;
678
679
return ;
679
680
}
680
681
} ,
681
682
ty:: ty_rptr( r, mt) => match ty:: get ( mt. ty ) . sty {
682
- ty:: ty_vec( mt, None ) => ( mt. ty , r, mt. mutbl ) ,
683
+ ty:: ty_vec( mt, None ) => ( mt. ty , r, mt. mutbl , None ) ,
683
684
_ => {
684
- check_err ( ) ;
685
+ check_err ( "a vector pattern" . to_string ( ) ) ;
685
686
return ;
686
687
}
687
688
} ,
688
689
_ => {
689
- check_err ( ) ;
690
+ check_err ( "a vector pattern" . to_string ( ) ) ;
690
691
return ;
691
692
}
692
693
} ;
694
+
695
+ let min_len = before. len ( ) + after. len ( ) ;
696
+ fixed. and_then ( |count| match slice {
697
+ Some ( _) if count < min_len =>
698
+ Some ( format ! ( "a fixed vector pattern of size at least {}" , min_len) ) ,
699
+
700
+ None if count != min_len =>
701
+ Some ( format ! ( "a fixed vector pattern of size {}" , min_len) ) ,
702
+
703
+ _ => None
704
+ } ) . and_then ( |message| {
705
+ check_err ( message) ;
706
+ Some ( ( ) )
707
+ } ) ;
708
+
693
709
for elt in before. iter ( ) {
694
710
check_pat ( pcx, & * * elt, elt_type) ;
695
711
}
0 commit comments