Skip to content

Commit

Permalink
Rollup merge of rust-lang#68992 - matthewjasper:imm-binding-after-at,…
Browse files Browse the repository at this point in the history
… r=Centril

Correctly parse `mut a @ b`

r? @Centril

Closes rust-lang#67861
Closes rust-lang#67926
  • Loading branch information
Dylan-DPC authored Feb 10, 2020
2 parents e3315f6 + fa5a3c3 commit 64d2d04
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 64d2d04

Please sign in to comment.