diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs index bcd53dbfeb2..cd4944deadb 100644 --- a/src/libsyntax/parse/lexer/mod.rs +++ b/src/libsyntax/parse/lexer/mod.rs @@ -968,9 +968,10 @@ impl<'a> StringReader<'a> { } else { let span = self.mk_sp(start, self.pos); let mut suggestion = "\\u{".to_owned(); + let msg = "incorrect unicode escape sequence"; let mut err = self.sess.span_diagnostic.struct_span_err( span, - "incorrect unicode escape sequence", + msg, ); let mut i = 0; while let (Some(ch), true) = (self.ch, i < 6) { @@ -991,8 +992,8 @@ impl<'a> StringReader<'a> { Applicability::MaybeIncorrect, ); } else { - err.span_help( - span, + err.span_label(span, msg); + err.help( "format of unicode escape sequences is `\\u{...}`", ); } @@ -1018,25 +1019,24 @@ impl<'a> StringReader<'a> { } c => { let pos = self.pos; - let mut err = self.struct_err_span_char(escaped_pos, - pos, - if ascii_only { - "unknown byte escape" - } else { - "unknown character \ - escape" - }, - c); + let msg = if ascii_only { + "unknown byte escape" + } else { + "unknown character escape" + }; + let mut err = self.struct_err_span_char(escaped_pos, pos, msg, c); + err.span_label(self.mk_sp(escaped_pos, pos), msg); if e == '\r' { - err.span_help(self.mk_sp(escaped_pos, pos), - "this is an isolated carriage return; consider \ - checking your editor and version control \ - settings"); + err.help( + "this is an isolated carriage return; consider checking \ + your editor and version control settings", + ); } if (e == '{' || e == '}') && !ascii_only { - err.span_help(self.mk_sp(escaped_pos, pos), - "if used in a formatting string, curly braces \ - are escaped with `{{` and `}}`"); + err.help( + "if used in a formatting string, curly braces are escaped \ + with `{{` and `}}`", + ); } err.emit(); false diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index aa70c54a1ef..48702cf3c4c 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -4229,19 +4229,24 @@ impl<'a> Parser<'a> { fn parse_pat_list(&mut self) -> PResult<'a, (Vec>, Option, bool)> { let mut fields = Vec::new(); let mut ddpos = None; + let mut prev_dd_sp = None; let mut trailing_comma = false; loop { if self.eat(&token::DotDot) { if ddpos.is_none() { ddpos = Some(fields.len()); + prev_dd_sp = Some(self.prev_span); } else { // Emit a friendly error, ignore `..` and continue parsing - self.struct_span_err( + let mut err = 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(); + ); + err.span_label(self.prev_span, "can only be used once per pattern"); + if let Some(sp) = prev_dd_sp { + err.span_label(sp, "previously present here"); + } + err.emit(); } } else if !self.check(&token::CloseDelim(token::Paren)) { fields.push(self.parse_pat(None)?); diff --git a/src/test/ui/parser/byte-literals.stderr b/src/test/ui/parser/byte-literals.stderr index 36cb0170a14..4edeccfe475 100644 --- a/src/test/ui/parser/byte-literals.stderr +++ b/src/test/ui/parser/byte-literals.stderr @@ -2,13 +2,13 @@ error: unknown byte escape: f --> $DIR/byte-literals.rs:6:21 | LL | static FOO: u8 = b'/f'; - | ^ + | ^ unknown byte escape error: unknown byte escape: f --> $DIR/byte-literals.rs:9:8 | LL | b'/f'; - | ^ + | ^ unknown byte escape error: invalid character in numeric character escape: Z --> $DIR/byte-literals.rs:10:10 diff --git a/src/test/ui/parser/byte-string-literals.stderr b/src/test/ui/parser/byte-string-literals.stderr index 2e9b13b933e..45c1a94b519 100644 --- a/src/test/ui/parser/byte-string-literals.stderr +++ b/src/test/ui/parser/byte-string-literals.stderr @@ -2,13 +2,13 @@ error: unknown byte escape: f --> $DIR/byte-string-literals.rs:6:32 | LL | static FOO: &'static [u8] = b"/f"; - | ^ + | ^ unknown byte escape error: unknown byte escape: f --> $DIR/byte-string-literals.rs:9:8 | LL | b"/f"; - | ^ + | ^ unknown byte escape error: invalid character in numeric character escape: Z --> $DIR/byte-string-literals.rs:10:10 diff --git a/src/test/ui/parser/issue-23620-invalid-escapes.stderr b/src/test/ui/parser/issue-23620-invalid-escapes.stderr index f6e476ab0cd..669a6d26905 100644 --- a/src/test/ui/parser/issue-23620-invalid-escapes.stderr +++ b/src/test/ui/parser/issue-23620-invalid-escapes.stderr @@ -14,13 +14,9 @@ error: incorrect unicode escape sequence --> $DIR/issue-23620-invalid-escapes.rs:10:15 | LL | let _ = b'/u'; - | ^^ + | ^^ incorrect unicode escape sequence | -help: format of unicode escape sequences is `/u{...}` - --> $DIR/issue-23620-invalid-escapes.rs:10:15 - | -LL | let _ = b'/u'; - | ^^ + = help: format of unicode escape sequences is `/u{...}` error: unicode escape sequences cannot be used as a byte or in a byte string --> $DIR/issue-23620-invalid-escapes.rs:10:15 @@ -80,13 +76,9 @@ error: incorrect unicode escape sequence --> $DIR/issue-23620-invalid-escapes.rs:28:28 | LL | let _ = b"/u{a4a4} /xf /u"; - | ^^ + | ^^ incorrect unicode escape sequence | -help: format of unicode escape sequences is `/u{...}` - --> $DIR/issue-23620-invalid-escapes.rs:28:28 - | -LL | let _ = b"/u{a4a4} /xf /u"; - | ^^ + = help: format of unicode escape sequences is `/u{...}` error: unicode escape sequences cannot be used as a byte or in a byte string --> $DIR/issue-23620-invalid-escapes.rs:28:28 @@ -110,13 +102,9 @@ error: incorrect unicode escape sequence --> $DIR/issue-23620-invalid-escapes.rs:34:18 | LL | let _ = "/xf /u"; - | ^^ + | ^^ incorrect unicode escape sequence | -help: format of unicode escape sequences is `/u{...}` - --> $DIR/issue-23620-invalid-escapes.rs:34:18 - | -LL | let _ = "/xf /u"; - | ^^ + = help: format of unicode escape sequences is `/u{...}` error: incorrect unicode escape sequence --> $DIR/issue-23620-invalid-escapes.rs:39:14 diff --git a/src/test/ui/parser/lex-bad-char-literals-1.stderr b/src/test/ui/parser/lex-bad-char-literals-1.stderr index 3c8550e3dbe..e6b71108086 100644 --- a/src/test/ui/parser/lex-bad-char-literals-1.stderr +++ b/src/test/ui/parser/lex-bad-char-literals-1.stderr @@ -14,13 +14,13 @@ error: unknown character escape: /u{25cf} --> $DIR/lex-bad-char-literals-1.rs:11:7 | LL | '/●' - | ^ + | ^ unknown character escape error: unknown character escape: /u{25cf} --> $DIR/lex-bad-char-literals-1.rs:15:7 | LL | "/●" - | ^ + | ^ unknown character escape error: aborting due to 4 previous errors diff --git a/src/test/ui/parser/lex-bare-cr-string-literal-doc-comment.stderr b/src/test/ui/parser/lex-bare-cr-string-literal-doc-comment.stderr index 19117bfa9c9..b4d538bf613 100644 --- a/src/test/ui/parser/lex-bare-cr-string-literal-doc-comment.stderr +++ b/src/test/ui/parser/lex-bare-cr-string-literal-doc-comment.stderr @@ -38,13 +38,9 @@ error: unknown character escape: /r --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:27:19 | LL | let _s = "foo/ bar"; - | ^ + | ^ unknown character escape | -help: this is an isolated carriage return; consider checking your editor and version control settings - --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:27:19 - | -LL | let _s = "foo/ bar"; - | ^ + = help: this is an isolated carriage return; consider checking your editor and version control settings error: aborting due to 7 previous errors diff --git a/src/test/ui/parser/pat-tuple-3.stderr b/src/test/ui/parser/pat-tuple-3.stderr index 0ad7d27b94e..c9f14bb9042 100644 --- a/src/test/ui/parser/pat-tuple-3.stderr +++ b/src/test/ui/parser/pat-tuple-3.stderr @@ -2,7 +2,9 @@ error: `..` can only be used once per tuple or tuple struct pattern --> $DIR/pat-tuple-3.rs:3:19 | LL | (.., pat, ..) => {} - | ^^ can only be used once per pattern + | -- ^^ can only be used once per pattern + | | + | previously present here error: aborting due to previous error diff --git a/src/test/ui/parser/trailing-carriage-return-in-string.stderr b/src/test/ui/parser/trailing-carriage-return-in-string.stderr index 972e4296da3..f70f8ac8d77 100644 --- a/src/test/ui/parser/trailing-carriage-return-in-string.stderr +++ b/src/test/ui/parser/trailing-carriage-return-in-string.stderr @@ -2,13 +2,9 @@ error: unknown character escape: /r --> $DIR/trailing-carriage-return-in-string.rs:10:25 | LL | let bad = "This is / a test"; - | ^ + | ^ unknown character escape | -help: this is an isolated carriage return; consider checking your editor and version control settings - --> $DIR/trailing-carriage-return-in-string.rs:10:25 - | -LL | let bad = "This is / a test"; - | ^ + = help: this is an isolated carriage return; consider checking your editor and version control settings error: aborting due to previous error diff --git a/src/test/ui/parser/wrong-escape-of-curly-braces.stderr b/src/test/ui/parser/wrong-escape-of-curly-braces.stderr index 90debfc337d..346eba04c65 100644 --- a/src/test/ui/parser/wrong-escape-of-curly-braces.stderr +++ b/src/test/ui/parser/wrong-escape-of-curly-braces.stderr @@ -2,25 +2,17 @@ error: unknown character escape: { --> $DIR/wrong-escape-of-curly-braces.rs:3:17 | LL | let bad = "/{it is wrong/}"; - | ^ + | ^ unknown character escape | -help: if used in a formatting string, curly braces are escaped with `{{` and `}}` - --> $DIR/wrong-escape-of-curly-braces.rs:3:17 - | -LL | let bad = "/{it is wrong/}"; - | ^ + = help: if used in a formatting string, curly braces are escaped with `{{` and `}}` error: unknown character escape: } --> $DIR/wrong-escape-of-curly-braces.rs:3:30 | LL | let bad = "/{it is wrong/}"; - | ^ + | ^ unknown character escape | -help: if used in a formatting string, curly braces are escaped with `{{` and `}}` - --> $DIR/wrong-escape-of-curly-braces.rs:3:30 - | -LL | let bad = "/{it is wrong/}"; - | ^ + = help: if used in a formatting string, curly braces are escaped with `{{` and `}}` error: aborting due to 2 previous errors