Skip to content

Commit fa3e19f

Browse files
committed
fix
1 parent 0d46cfe commit fa3e19f

File tree

1 file changed

+19
-10
lines changed

1 file changed

+19
-10
lines changed

src/librustc_resolve/lib.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)