Rollup merge of #68992 - matthewjasper:imm-binding-after-at, r=Centril

Correctly parse `mut a @ b`

r? @Centril

Closes #67861
Closes #67926
This commit is contained in:
Dylan DPC 2020-02-10 01:54:20 +01:00 committed by GitHub
commit 64d2d04eb9
6 changed files with 82 additions and 4 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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
}

View File

@ -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`.

View File

@ -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
}

View File

@ -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`.