Fix pretty printing an AST representing &(mut ident)

`PatKind::Ref(PatKind::Ident(BindingMode::ByValue(Mutability::Mut), ..), ..)`
is an AST representing `&(mut ident)`. It was errorneously printed as
`&mut ident` which reparsed into a syntactically different AST.

This affected help diagnostics in the parser.
This commit is contained in:
Thomas Bahn 2020-12-19 23:13:50 +01:00
parent b1964e60b7
commit b05ab18aec
3 changed files with 28 additions and 1 deletions

View File

@ -2420,7 +2420,15 @@ fn print_qpath(&mut self, path: &ast::Path, qself: &ast::QSelf, colons_before_pa
if mutbl == ast::Mutability::Mut {
self.s.word("mut ");
}
self.print_pat(inner);
if let PatKind::Ident(ast::BindingMode::ByValue(ast::Mutability::Mut), ..) =
inner.kind
{
self.popen();
self.print_pat(inner);
self.pclose();
} else {
self.print_pat(inner);
}
}
PatKind::Lit(ref e) => self.print_expr(&**e),
PatKind::Range(ref begin, ref end, Spanned { node: ref end_kind, .. }) => {

View File

@ -0,0 +1,9 @@
// Regression test for correct pretty-printing of an AST representing `&(mut x)` in help
// suggestion diagnostic.
fn main() {
let mut &x = &0;
//~^ ERROR `mut` must be attached to each individual binding
//~| HELP add `mut` to each binding
//~| SUGGESTION &(mut x)
}

View File

@ -0,0 +1,10 @@
error: `mut` must be attached to each individual binding
--> $DIR/issue-80186-mut-binding-help-suggestion.rs:5:9
|
LL | let mut &x = &0;
| ^^^^^^ help: add `mut` to each binding: `&(mut x)`
|
= note: `mut` may be followed by `variable` and `variable @ pattern`
error: aborting due to previous error