about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2019-01-11 21:33:57 -0800
committerEsteban Küber <esteban@kuber.com.ar>2019-01-11 21:33:57 -0800
commit8119017746959f7ecb3ba93c6c32a7d6d9dafc40 (patch)
tree5cffe809873c2d9b25f5e6e5c7db00c07063bd6e
parent975f8b5e32cfcd368a245169dd3d3cc536b0cc28 (diff)
downloadrust-8119017746959f7ecb3ba93c6c32a7d6d9dafc40.tar.gz
rust-8119017746959f7ecb3ba93c6c32a7d6d9dafc40.zip
Continue evaluating after finding incorrect .. in pattern
-rw-r--r--src/libsyntax/parse/parser.rs13
-rw-r--r--src/test/ui/parser/pat-tuple-2.rs4
-rw-r--r--src/test/ui/parser/pat-tuple-2.stderr16
-rw-r--r--src/test/ui/parser/pat-tuple-3.rs4
-rw-r--r--src/test/ui/parser/pat-tuple-3.stderr16
5 files changed, 42 insertions, 11 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index ce9db4d0468..6228598ab61 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -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)?);
@@ -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))
diff --git a/src/test/ui/parser/pat-tuple-2.rs b/src/test/ui/parser/pat-tuple-2.rs
index 108278fa58e..574cb6045dc 100644
--- a/src/test/ui/parser/pat-tuple-2.rs
+++ b/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
     }
 }
diff --git a/src/test/ui/parser/pat-tuple-2.stderr b/src/test/ui/parser/pat-tuple-2.stderr
index ec123363566..178be83d9bf 100644
--- a/src/test/ui/parser/pat-tuple-2.stderr
+++ b/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`.
diff --git a/src/test/ui/parser/pat-tuple-3.rs b/src/test/ui/parser/pat-tuple-3.rs
index 63dcde45bfb..33edb0007e7 100644
--- a/src/test/ui/parser/pat-tuple-3.rs
+++ b/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
     }
 }
diff --git a/src/test/ui/parser/pat-tuple-3.stderr b/src/test/ui/parser/pat-tuple-3.stderr
index 90940eb1723..fcb657393b8 100644
--- a/src/test/ui/parser/pat-tuple-3.stderr
+++ b/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`.