Rollup merge of #59322 - estebank:diag-tweak, r=davidtwco

Tweak incorrect escaped char diagnostic
diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs
index bcd53db..cd4944d 100644
--- a/src/libsyntax/parse/lexer/mod.rs
+++ b/src/libsyntax/parse/lexer/mod.rs
@@ -968,9 +968,10 @@
                                 } 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 @@
                                             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 @@
                             }
                             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 648ee77..5627ac3 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -4229,19 +4229,24 @@
     fn parse_pat_list(&mut self) -> PResult<'a, (Vec<P<Pat>>, Option<usize>, 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 36cb017..4edeccf 100644
--- a/src/test/ui/parser/byte-literals.stderr
+++ b/src/test/ui/parser/byte-literals.stderr
@@ -2,13 +2,13 @@
   --> $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 2e9b13b..45c1a94 100644
--- a/src/test/ui/parser/byte-string-literals.stderr
+++ b/src/test/ui/parser/byte-string-literals.stderr
@@ -2,13 +2,13 @@
   --> $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 f6e476a..669a6d2 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 @@
   --> $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 @@
   --> $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 @@
   --> $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 3c8550e..e6b7110 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 @@
   --> $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 19117bf..b4d538b 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
Binary files differ
diff --git a/src/test/ui/parser/pat-tuple-3.stderr b/src/test/ui/parser/pat-tuple-3.stderr
index 0ad7d27..c9f14bb 100644
--- a/src/test/ui/parser/pat-tuple-3.stderr
+++ b/src/test/ui/parser/pat-tuple-3.stderr
@@ -2,7 +2,9 @@
   --> $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 972e429..f70f8ac 100644
--- a/src/test/ui/parser/trailing-carriage-return-in-string.stderr
+++ b/src/test/ui/parser/trailing-carriage-return-in-string.stderr
Binary files differ
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 90debfc..346eba0 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 @@
   --> $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