Don't parse mut a @ b as mut a @ mut b
This commit is contained in:
parent
64ea639c12
commit
fa5a3c35dc
6 changed files with 82 additions and 4 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
¬_mut;
|
||||
let not_mut @ mut is_mut = 42;
|
||||
&mut is_mut;
|
||||
¬_mut;
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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`.
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue