@@ -1879,6 +1879,7 @@ impl<'a> Resolver<'a> {
18791879 }
18801880
18811881 let mut missing_vars = FxHashMap ( ) ;
1882+ let mut inconsistent_vars = FxHashMap ( ) ;
18821883 for ( i, p) in arm. pats . iter ( ) . enumerate ( ) {
18831884 let map_i = self . binding_mode_map ( & p) ;
18841885
@@ -1889,22 +1890,27 @@ impl<'a> Resolver<'a> {
18891890
18901891 let map_j = self . binding_mode_map ( & q) ;
18911892 for ( & key, & binding_i) in & map_i {
1893+ if map_j. len ( ) == 0 { // Account for missing bindings when
1894+ let spans = missing_vars // map_j has none.
1895+ . entry ( ( key. name , binding_i. span ) )
1896+ . or_insert ( FxHashSet ( ) ) ;
1897+ spans. insert ( ( q. span , i + 1 ) ) ;
1898+ }
18921899 for ( & key_j, & binding_j) in & map_j {
18931900 match map_i. get ( & key_j) {
18941901 None => { // missing binding
18951902 let spans = missing_vars
18961903 . entry ( ( key_j. name , binding_j. span ) )
1897- . or_insert ( FxHashMap ( ) ) ;
1898- spans. entry ( ( p. span , i + 1 ) ) . or_insert ( Some ( ( ) ) ) ;
1904+ . or_insert ( FxHashSet ( ) ) ;
1905+ spans. insert ( ( p. span , i + 1 ) ) ;
18991906 }
1900- Some ( binding_j ) => { // check consistent binding
1907+ Some ( binding_i ) => { // check consistent binding
19011908 if binding_i. binding_mode != binding_j. binding_mode {
1902- resolve_error ( self ,
1903- binding_i. span ,
1904- ResolutionError :: VariableBoundWithDifferentMode (
1905- key. name ,
1906- i + 1 ,
1907- binding_i. span ) ) ;
1909+ inconsistent_vars
1910+ . entry ( key. name )
1911+ . or_insert ( ( binding_j. span ,
1912+ binding_i. span ,
1913+ i + 1 ) ) ;
19081914 }
19091915 }
19101916 }
@@ -1914,9 +1920,12 @@ impl<'a> Resolver<'a> {
19141920 }
19151921 for ( k, v) in missing_vars {
19161922 let ( name, sp) = k;
1917- let v = v. iter ( ) . map ( |x| * x. 0 ) . collect :: < Vec < _ > > ( ) ;
1923+ let v = v. iter ( ) . map ( |x| * x) . collect :: < Vec < _ > > ( ) ;
19181924 resolve_error ( self , sp, ResolutionError :: VariableNotBoundInPattern ( name, sp, v) ) ;
19191925 }
1926+ for ( k, v) in inconsistent_vars {
1927+ resolve_error ( self , v. 0 , ResolutionError :: VariableBoundWithDifferentMode ( k, v. 2 , v. 1 ) ) ;
1928+ }
19201929 }
19211930
19221931 fn resolve_arm ( & mut self , arm : & Arm ) {
0 commit comments