Ensure 'let mut ;' where ':pat' is banned.
This commit is contained in:
@@ -384,6 +384,7 @@ impl<'a> Parser<'a> {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Parse a mutable binding with the `mut` token already eaten.
|
||||||
fn parse_pat_ident_mut(&mut self) -> PResult<'a, PatKind> {
|
fn parse_pat_ident_mut(&mut self) -> PResult<'a, PatKind> {
|
||||||
let mut_span = self.prev_span;
|
let mut_span = self.prev_span;
|
||||||
|
|
||||||
@@ -393,6 +394,14 @@ impl<'a> Parser<'a> {
|
|||||||
|
|
||||||
self.recover_additional_muts();
|
self.recover_additional_muts();
|
||||||
|
|
||||||
|
// Make sure we don't allow e.g. `let mut $p;` where `$p:pat`.
|
||||||
|
if let token::Interpolated(ref nt) = self.token.kind {
|
||||||
|
if let token::NtPat(_) = **nt {
|
||||||
|
self.expected_ident_found().emit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse the pattern we hope to be an identifier.
|
||||||
let mut pat = self.parse_pat(Some("identifier"))?;
|
let mut pat = self.parse_pat(Some("identifier"))?;
|
||||||
|
|
||||||
// Add `mut` to any binding in the parsed pattern.
|
// Add `mut` to any binding in the parsed pattern.
|
||||||
|
|||||||
@@ -32,4 +32,12 @@ pub fn main() {
|
|||||||
let mut W(mut a, W(b, W(ref c, W(d, B { box f }))))
|
let mut W(mut a, W(b, W(ref c, W(d, B { box f }))))
|
||||||
//~^ ERROR `mut` must be attached to each individual binding
|
//~^ ERROR `mut` must be attached to each individual binding
|
||||||
= W(0, W(1, W(2, W(3, B { f: Box::new(4u8) }))));
|
= W(0, W(1, W(2, W(3, B { f: Box::new(4u8) }))));
|
||||||
|
|
||||||
|
// Make sure we don't accidentally allow `mut $p` where `$p:pat`.
|
||||||
|
macro_rules! foo {
|
||||||
|
($p:pat) => {
|
||||||
|
let mut $p = 0; //~ ERROR expected identifier, found `x`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foo!(x);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,5 +64,14 @@ error: `mut` must be attached to each individual binding
|
|||||||
LL | let mut W(mut a, W(b, W(ref c, W(d, B { box f }))))
|
LL | let mut W(mut a, W(b, W(ref c, W(d, B { box f }))))
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: add `mut` to each binding: `W(mut a, W(mut b, W(ref c, W(mut d, B { box mut f }))))`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: add `mut` to each binding: `W(mut a, W(mut b, W(ref c, W(mut d, B { box mut f }))))`
|
||||||
|
|
||||||
error: aborting due to 9 previous errors
|
error: expected identifier, found `x`
|
||||||
|
--> $DIR/mut-patterns.rs:39:21
|
||||||
|
|
|
||||||
|
LL | let mut $p = 0;
|
||||||
|
| ^^ expected identifier
|
||||||
|
...
|
||||||
|
LL | foo!(x);
|
||||||
|
| -------- in this macro invocation
|
||||||
|
|
||||||
|
error: aborting due to 10 previous errors
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user