@@ -1879,6 +1879,7 @@ impl<'a> Resolver<'a> {
1879
1879
}
1880
1880
1881
1881
let mut missing_vars = FxHashMap ( ) ;
1882
+ let mut inconsistent_vars = FxHashMap ( ) ;
1882
1883
for ( i, p) in arm. pats . iter ( ) . enumerate ( ) {
1883
1884
let map_i = self . binding_mode_map ( & p) ;
1884
1885
@@ -1889,22 +1890,27 @@ impl<'a> Resolver<'a> {
1889
1890
1890
1891
let map_j = self . binding_mode_map ( & q) ;
1891
1892
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
+ }
1892
1899
for ( & key_j, & binding_j) in & map_j {
1893
1900
match map_i. get ( & key_j) {
1894
1901
None => { // missing binding
1895
1902
let spans = missing_vars
1896
1903
. 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 ) ) ;
1899
1906
}
1900
- Some ( binding_j ) => { // check consistent binding
1907
+ Some ( binding_i ) => { // check consistent binding
1901
1908
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 ) ) ;
1908
1914
}
1909
1915
}
1910
1916
}
@@ -1914,9 +1920,12 @@ impl<'a> Resolver<'a> {
1914
1920
}
1915
1921
for ( k, v) in missing_vars {
1916
1922
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 < _ > > ( ) ;
1918
1924
resolve_error ( self , sp, ResolutionError :: VariableNotBoundInPattern ( name, sp, v) ) ;
1919
1925
}
1926
+ for ( k, v) in inconsistent_vars {
1927
+ resolve_error ( self , v. 0 , ResolutionError :: VariableBoundWithDifferentMode ( k, v. 2 , v. 1 ) ) ;
1928
+ }
1920
1929
}
1921
1930
1922
1931
fn resolve_arm ( & mut self , arm : & Arm ) {
0 commit comments