From 3df500db29b6f50c5c74e7735a9e007ae90206d7 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Tue, 1 Jan 2019 19:14:00 +0300 Subject: [PATCH] syntax: Fix regression in diagnostics for patterns in trait method parameters --- src/libsyntax/parse/parser.rs | 3 ++- src/test/ui/E0642.rs | 2 ++ src/test/ui/E0642.stderr | 12 +++++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 52da8a072c751..a9d28362f5759 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1866,7 +1866,8 @@ impl<'a> Parser<'a> { let parser_snapshot_before_ty = self.clone(); self.eat_incorrect_doc_comment("a method argument's type"); let mut ty = self.parse_ty(); - if ty.is_ok() && self.token == token::Colon { + if ty.is_ok() && self.token != token::Comma && + self.token != token::CloseDelim(token::Paren) { // This wasn't actually a type, but a pattern looking like a type, // so we are going to rollback and re-parse for recovery. ty = self.unexpected(); diff --git a/src/test/ui/E0642.rs b/src/test/ui/E0642.rs index 8b74e5abe19df..cfbd362c1da19 100644 --- a/src/test/ui/E0642.rs +++ b/src/test/ui/E0642.rs @@ -6,6 +6,8 @@ trait T { fn bar((x, y): (i32, i32)) {} //~ ERROR patterns aren't allowed in methods without bodies + fn method(S { .. }: S) {} //~ ERROR patterns aren't allowed in methods without bodies + fn f(&ident: &S) {} // ok fn g(&&ident: &&S) {} // ok fn h(mut ident: S) {} // ok diff --git a/src/test/ui/E0642.stderr b/src/test/ui/E0642.stderr index c3a230d5acf3c..4c82a6cbd21b4 100644 --- a/src/test/ui/E0642.stderr +++ b/src/test/ui/E0642.stderr @@ -18,6 +18,16 @@ help: give this argument a name or use an underscore to ignore it LL | fn bar(_: (i32, i32)) {} //~ ERROR patterns aren't allowed in methods without bodies | ^ -error: aborting due to 2 previous errors +error[E0642]: patterns aren't allowed in methods without bodies + --> $DIR/E0642.rs:9:15 + | +LL | fn method(S { .. }: S) {} //~ ERROR patterns aren't allowed in methods without bodies + | ^^^^^^^^ +help: give this argument a name or use an underscore to ignore it + | +LL | fn method(_: S) {} //~ ERROR patterns aren't allowed in methods without bodies + | ^ + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0642`.