Skip to content

Commit

Permalink
Don't parse mut a @ b as mut a @ mut b
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewjasper committed Feb 9, 2020
1 parent 64ea639 commit fa5a3c3
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 4 deletions.
11 changes: 7 additions & 4 deletions src/librustc_parse/parser/pat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -542,11 +542,14 @@ impl<'a> Parser<'a> {
}

fn visit_pat(&mut self, pat: &mut P<Pat>) {
if let PatKind::Ident(BindingMode::ByValue(ref mut m @ Mutability::Not), ..) =
pat.kind
{
*m = Mutability::Mut;
if let PatKind::Ident(ref mut bm, ..) = pat.kind {
if let BindingMode::ByValue(ref mut m @ Mutability::Not) = bm {
*m = Mutability::Mut;
}
self.0 = true;
// Don't recurse into the subpattern, mut on the outer
// binding doesn't affect the inner bindings.
return;
}
noop_visit_pat(pat, self);
}
Expand Down
13 changes: 13 additions & 0 deletions src/test/ui/pattern/bindings-after-at/nested-binding-mode-lint.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// check-pass

#![feature(bindings_after_at)]
#![deny(unused_mut)]

fn main() {
let mut is_mut @ not_mut = 42;
&mut is_mut;
&not_mut;
let not_mut @ mut is_mut = 42;
&mut is_mut;
&not_mut;
}
13 changes: 13 additions & 0 deletions src/test/ui/pattern/bindings-after-at/nested-binding-modes-mut.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#![feature(bindings_after_at)]

fn main() {
let mut is_mut @ not_mut = 42;
&mut is_mut;
&mut not_mut;
//~^ ERROR cannot borrow

let not_mut @ mut is_mut = 42;
&mut is_mut;
&mut not_mut;
//~^ ERROR cannot borrow
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
error[E0596]: cannot borrow `not_mut` as mutable, as it is not declared as mutable
--> $DIR/nested-binding-modes-mut.rs:6:5
|
LL | let mut is_mut @ not_mut = 42;
| ------- help: consider changing this to be mutable: `mut not_mut`
LL | &mut is_mut;
LL | &mut not_mut;
| ^^^^^^^^^^^^ cannot borrow as mutable

error[E0596]: cannot borrow `not_mut` as mutable, as it is not declared as mutable
--> $DIR/nested-binding-modes-mut.rs:11:5
|
LL | let not_mut @ mut is_mut = 42;
| -------------------- help: consider changing this to be mutable: `mut not_mut`
LL | &mut is_mut;
LL | &mut not_mut;
| ^^^^^^^^^^^^ cannot borrow as mutable

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0596`.
13 changes: 13 additions & 0 deletions src/test/ui/pattern/bindings-after-at/nested-binding-modes-ref.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#![feature(bindings_after_at)]

fn main() {
let ref is_ref @ is_val = 42;
*is_ref;
*is_val;
//~^ ERROR cannot be dereferenced

let is_val @ ref is_ref = 42;
*is_ref;
*is_val;
//~^ ERROR cannot be dereferenced
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
error[E0614]: type `{integer}` cannot be dereferenced
--> $DIR/nested-binding-modes-ref.rs:6:5
|
LL | *is_val;
| ^^^^^^^

error[E0614]: type `{integer}` cannot be dereferenced
--> $DIR/nested-binding-modes-ref.rs:11:5
|
LL | *is_val;
| ^^^^^^^

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0614`.

0 comments on commit fa5a3c3

Please sign in to comment.