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