Skip to content

Commit

Permalink
Continue evaluating after finding incorrect .. in pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
estebank committed Jan 12, 2019
1 parent 975f8b5 commit 8119017
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 11 deletions.
13 changes: 10 additions & 3 deletions src/libsyntax/parse/parser.rs
Expand Up @@ -3814,8 +3814,12 @@ impl<'a> Parser<'a> {
ddpos = Some(fields.len());
} else {
// Emit a friendly error, ignore `..` and continue parsing
self.span_err(self.prev_span,
"`..` can only be used once per tuple or tuple struct pattern");
self.struct_span_err(
self.prev_span,
"`..` can only be used once per tuple or tuple struct pattern",
)
.span_label(self.prev_span, "can only be used once per pattern")
.emit();
}
} else if !self.check(&token::CloseDelim(token::Paren)) {
fields.push(self.parse_pat(None)?);
Expand All @@ -3831,7 +3835,10 @@ impl<'a> Parser<'a> {

if ddpos == Some(fields.len()) && trailing_comma {
// `..` needs to be followed by `)` or `, pat`, `..,)` is disallowed.
self.span_err(self.prev_span, "trailing comma is not permitted after `..`");
let msg = "trailing comma is not permitted after `..`";
self.struct_span_err(self.prev_span, msg)
.span_label(self.prev_span, msg)
.emit();
}

Ok((fields, ddpos, trailing_comma))
Expand Down
4 changes: 3 additions & 1 deletion src/test/ui/parser/pat-tuple-2.rs
@@ -1,5 +1,7 @@
fn main() {
match 0 {
(pat, ..,) => {} //~ ERROR trailing comma is not permitted after `..`
(pat, ..,) => {}
//~^ ERROR trailing comma is not permitted after `..`
//~| ERROR mismatched types
}
}
16 changes: 13 additions & 3 deletions src/test/ui/parser/pat-tuple-2.stderr
@@ -1,8 +1,18 @@
error: trailing comma is not permitted after `..`
--> $DIR/pat-tuple-2.rs:3:17
|
LL | (pat, ..,) => {} //~ ERROR trailing comma is not permitted after `..`
| ^
LL | (pat, ..,) => {}
| ^ trailing comma is not permitted after `..`

error: aborting due to previous error
error[E0308]: mismatched types
--> $DIR/pat-tuple-2.rs:3:9
|
LL | (pat, ..,) => {}
| ^^^^^^^^^^ expected integer, found tuple
|
= note: expected type `{integer}`
found type `(_,)`

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0308`.
4 changes: 3 additions & 1 deletion src/test/ui/parser/pat-tuple-3.rs
@@ -1,5 +1,7 @@
fn main() {
match 0 {
(.., pat, ..) => {} //~ ERROR `..` can only be used once per tuple or tuple struct pattern
(.., pat, ..) => {}
//~^ ERROR `..` can only be used once per tuple or tuple struct pattern
//~| ERROR mismatched types
}
}
16 changes: 13 additions & 3 deletions src/test/ui/parser/pat-tuple-3.stderr
@@ -1,8 +1,18 @@
error: `..` can only be used once per tuple or tuple struct pattern
--> $DIR/pat-tuple-3.rs:3:19
|
LL | (.., pat, ..) => {} //~ ERROR `..` can only be used once per tuple or tuple struct pattern
| ^^
LL | (.., pat, ..) => {}
| ^^ can only be used once per pattern

error: aborting due to previous error
error[E0308]: mismatched types
--> $DIR/pat-tuple-3.rs:3:9
|
LL | (.., pat, ..) => {}
| ^^^^^^^^^^^^^ expected integer, found tuple
|
= note: expected type `{integer}`
found type `(_,)`

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0308`.

0 comments on commit 8119017

Please sign in to comment.