From 5238b523c3959e33add469af77b2ffa5a60b4cf6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Esteban=20K=C3=BCber?= <esteban@kuber.com.ar>
Date: Sun, 26 Aug 2018 17:22:36 -0700
Subject: [PATCH 1/4] Reword un-closed delimiter label

---
 src/libsyntax/parse/lexer/tokentrees.rs         |  4 ++--
 src/test/ui/issue-10636-1.rs                    |  3 ++-
 src/test/ui/issue-10636-1.stderr                |  8 ++++----
 src/test/ui/parser-recovery-1.rs                |  9 +++++----
 src/test/ui/parser-recovery-1.stderr            | 17 +++++++----------
 src/test/ui/parser-recovery-2.stderr            |  2 +-
 .../ui/resolve/token-error-correct-2.stderr     |  2 +-
 .../ui/resolve/token-error-correct-3.stderr     |  2 +-
 src/test/ui/resolve/token-error-correct.stderr  |  2 +-
 src/test/ui/token/issue-10636-2.stderr          |  2 +-
 10 files changed, 25 insertions(+), 26 deletions(-)

diff --git a/src/libsyntax/parse/lexer/tokentrees.rs b/src/libsyntax/parse/lexer/tokentrees.rs
index e2fd7faf90387..e8404adec0f89 100644
--- a/src/libsyntax/parse/lexer/tokentrees.rs
+++ b/src/libsyntax/parse/lexer/tokentrees.rs
@@ -49,7 +49,7 @@ impl<'a> StringReader<'a> {
                 let msg = "this file contains an un-closed delimiter";
                 let mut err = self.sess.span_diagnostic.struct_span_err(self.span, msg);
                 for &(_, sp) in &self.open_braces {
-                    err.span_help(sp, "did you mean to close this delimiter?");
+                    err.span_label(sp, "un-closed delimiter");
                 }
 
                 Err(err)
@@ -94,7 +94,7 @@ impl<'a> StringReader<'a> {
                             // delimiter. The previous unclosed delimiters could actually be
                             // closed! The parser just hasn't gotten to them yet.
                             if let Some(&(_, sp)) = self.open_braces.last() {
-                                err.span_label(sp, "unclosed delimiter");
+                                err.span_label(sp, "un-closed delimiter");
                             };
                             err.emit();
                         }
diff --git a/src/test/ui/issue-10636-1.rs b/src/test/ui/issue-10636-1.rs
index fdd50773593a8..375b951ee1585 100644
--- a/src/test/ui/issue-10636-1.rs
+++ b/src/test/ui/issue-10636-1.rs
@@ -10,7 +10,8 @@
 
 // compile-flags: -Z parse-only
 
-struct Obj { //~ NOTE: unclosed delimiter
+struct Obj {
+    //~^ NOTE: un-closed delimiter
     member: usize
 )
 //~^ ERROR incorrect close delimiter
diff --git a/src/test/ui/issue-10636-1.stderr b/src/test/ui/issue-10636-1.stderr
index af80e259fbd25..49b6d08aff505 100644
--- a/src/test/ui/issue-10636-1.stderr
+++ b/src/test/ui/issue-10636-1.stderr
@@ -1,9 +1,9 @@
 error: incorrect close delimiter: `)`
-  --> $DIR/issue-10636-1.rs:15:1
+  --> $DIR/issue-10636-1.rs:16:1
    |
-LL | struct Obj { //~ NOTE: unclosed delimiter
-   |            - unclosed delimiter
-LL |     member: usize
+LL | struct Obj {
+   |            - un-closed delimiter
+...
 LL | )
    | ^ incorrect close delimiter
 
diff --git a/src/test/ui/parser-recovery-1.rs b/src/test/ui/parser-recovery-1.rs
index 9fb4d6facddab..f51bcb9e70cad 100644
--- a/src/test/ui/parser-recovery-1.rs
+++ b/src/test/ui/parser-recovery-1.rs
@@ -14,11 +14,12 @@
 
 trait Foo {
     fn bar() {
-        let x = foo(); //~ ERROR cannot find function `foo` in this scope
-
+        let x = foo();
+        //~^ ERROR cannot find function `foo` in this scope
 }
 
 fn main() {
-    let x = y.;  //~ ERROR unexpected token
-                 //~^ ERROR cannot find value `y` in this scope
+    let x = y.;
+    //~^ ERROR unexpected token
+    //~| ERROR cannot find value `y` in this scope
 } //~ ERROR this file contains an un-closed delimiter
diff --git a/src/test/ui/parser-recovery-1.stderr b/src/test/ui/parser-recovery-1.stderr
index bf4070682fbb3..7d2f80148de33 100644
--- a/src/test/ui/parser-recovery-1.stderr
+++ b/src/test/ui/parser-recovery-1.stderr
@@ -1,31 +1,28 @@
 error: this file contains an un-closed delimiter
-  --> $DIR/parser-recovery-1.rs:24:55
+  --> $DIR/parser-recovery-1.rs:25:55
    |
+LL | trait Foo {
+   |           - un-closed delimiter
+...
 LL | } //~ ERROR this file contains an un-closed delimiter
    |                                                       ^
-   |
-help: did you mean to close this delimiter?
-  --> $DIR/parser-recovery-1.rs:15:11
-   |
-LL | trait Foo {
-   |           ^
 
 error: unexpected token: `;`
   --> $DIR/parser-recovery-1.rs:22:15
    |
-LL |     let x = y.;  //~ ERROR unexpected token
+LL |     let x = y.;
    |               ^
 
 error[E0425]: cannot find function `foo` in this scope
   --> $DIR/parser-recovery-1.rs:17:17
    |
-LL |         let x = foo(); //~ ERROR cannot find function `foo` in this scope
+LL |         let x = foo();
    |                 ^^^ not found in this scope
 
 error[E0425]: cannot find value `y` in this scope
   --> $DIR/parser-recovery-1.rs:22:13
    |
-LL |     let x = y.;  //~ ERROR unexpected token
+LL |     let x = y.;
    |             ^ not found in this scope
 
 error[E0601]: `main` function not found in crate `parser_recovery_1`
diff --git a/src/test/ui/parser-recovery-2.stderr b/src/test/ui/parser-recovery-2.stderr
index 1025dad3af773..2965e4eb58124 100644
--- a/src/test/ui/parser-recovery-2.stderr
+++ b/src/test/ui/parser-recovery-2.stderr
@@ -2,7 +2,7 @@ error: incorrect close delimiter: `)`
   --> $DIR/parser-recovery-2.rs:18:5
    |
 LL |     fn bar() {
-   |              - unclosed delimiter
+   |              - un-closed delimiter
 LL |         let x = foo(); //~ ERROR cannot find function `foo` in this scope
 LL |     ) //~ ERROR incorrect close delimiter: `)`
    |     ^ incorrect close delimiter
diff --git a/src/test/ui/resolve/token-error-correct-2.stderr b/src/test/ui/resolve/token-error-correct-2.stderr
index fcd4b4888b0ad..6965c864569c1 100644
--- a/src/test/ui/resolve/token-error-correct-2.stderr
+++ b/src/test/ui/resolve/token-error-correct-2.stderr
@@ -2,7 +2,7 @@ error: incorrect close delimiter: `)`
   --> $DIR/token-error-correct-2.rs:16:5
    |
 LL |     if foo {
-   |            - unclosed delimiter
+   |            - un-closed delimiter
 LL |     //~^ ERROR: cannot find value `foo`
 LL |     ) //~ ERROR: incorrect close delimiter: `)`
    |     ^ incorrect close delimiter
diff --git a/src/test/ui/resolve/token-error-correct-3.stderr b/src/test/ui/resolve/token-error-correct-3.stderr
index a546c2704d915..b6946f62388a7 100644
--- a/src/test/ui/resolve/token-error-correct-3.stderr
+++ b/src/test/ui/resolve/token-error-correct-3.stderr
@@ -2,7 +2,7 @@ error: incorrect close delimiter: `}`
   --> $DIR/token-error-correct-3.rs:30:9
    |
 LL |             callback(path.as_ref(); //~ ERROR expected one of
-   |                     - unclosed delimiter
+   |                     - un-closed delimiter
 ...
 LL |         } else { //~ ERROR: incorrect close delimiter: `}`
    |         ^ incorrect close delimiter
diff --git a/src/test/ui/resolve/token-error-correct.stderr b/src/test/ui/resolve/token-error-correct.stderr
index 1e246b6f085bd..7081a5976294d 100644
--- a/src/test/ui/resolve/token-error-correct.stderr
+++ b/src/test/ui/resolve/token-error-correct.stderr
@@ -2,7 +2,7 @@ error: incorrect close delimiter: `}`
   --> $DIR/token-error-correct.rs:16:1
    |
 LL |     foo(bar(;
-   |            - unclosed delimiter
+   |            - un-closed delimiter
 LL |     //~^ ERROR: expected expression, found `;`
 LL | }
    | ^ incorrect close delimiter
diff --git a/src/test/ui/token/issue-10636-2.stderr b/src/test/ui/token/issue-10636-2.stderr
index 634191bb5ef4e..10dc5f655698e 100644
--- a/src/test/ui/token/issue-10636-2.stderr
+++ b/src/test/ui/token/issue-10636-2.stderr
@@ -2,7 +2,7 @@ error: incorrect close delimiter: `}`
   --> $DIR/issue-10636-2.rs:18:1
    |
 LL |     option.map(|some| 42;
-   |               - unclosed delimiter
+   |               - un-closed delimiter
 ...
 LL | } //~ ERROR: incorrect close delimiter
    | ^ incorrect close delimiter

From 008aa5a24e152691d852bd9f0a2990b6e4377397 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Esteban=20K=C3=BCber?= <esteban@kuber.com.ar>
Date: Tue, 4 Sep 2018 08:09:49 -0700
Subject: [PATCH 2/4] Provide more context for unenclosed delimiters

 * When encountering EOF, point at the last opening brace that does not
   have the same indentation level as its close delimiter.
 * When encountering the wrong type of close delimiter, point at the
   likely correct open delimiter to give a better idea of what went
   wrong.
---
 src/libsyntax/parse/lexer/mod.rs              |  5 +++
 src/libsyntax/parse/lexer/tokentrees.rs       | 40 ++++++++++++++++++-
 src/libsyntax/source_map.rs                   | 32 ++++++++++-----
 src/test/ui/parser-recovery-1.stderr          |  5 +++
 src/test/ui/parser/unclosed-braces.rs         | 32 +++++++++++++++
 src/test/ui/parser/unclosed-braces.stderr     | 17 ++++++++
 .../ui/resolve/token-error-correct-3.stderr   |  2 +
 .../ui/resolve/token-error-correct.stderr     |  2 +
 src/test/ui/token/issue-10636-2.stderr        |  2 +
 9 files changed, 124 insertions(+), 13 deletions(-)
 create mode 100644 src/test/ui/parser/unclosed-braces.rs
 create mode 100644 src/test/ui/parser/unclosed-braces.stderr

diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs
index 96584a580f175..b7e8a880e7e50 100644
--- a/src/libsyntax/parse/lexer/mod.rs
+++ b/src/libsyntax/parse/lexer/mod.rs
@@ -66,6 +66,10 @@ pub struct StringReader<'a> {
     /// The raw source span which *does not* take `override_span` into account
     span_src_raw: Span,
     open_braces: Vec<(token::DelimToken, Span)>,
+    /// The type and spans for all braces that have different indentation.
+    ///
+    /// Used only for error recovery when arriving to EOF with mismatched braces.
+    suspicious_open_spans: Vec<(token::DelimToken, Span, Span)>,
     crate override_span: Option<Span>,
     last_unclosed_found_span: Option<Span>,
 }
@@ -216,6 +220,7 @@ impl<'a> StringReader<'a> {
             span: syntax_pos::DUMMY_SP,
             span_src_raw: syntax_pos::DUMMY_SP,
             open_braces: Vec::new(),
+            suspicious_open_spans: Vec::new(),
             override_span,
             last_unclosed_found_span: None,
         }
diff --git a/src/libsyntax/parse/lexer/tokentrees.rs b/src/libsyntax/parse/lexer/tokentrees.rs
index e8404adec0f89..2999e65ae4aea 100644
--- a/src/libsyntax/parse/lexer/tokentrees.rs
+++ b/src/libsyntax/parse/lexer/tokentrees.rs
@@ -52,6 +52,20 @@ impl<'a> StringReader<'a> {
                     err.span_label(sp, "un-closed delimiter");
                 }
 
+                if let Some((delim, _)) = self.open_braces.last() {
+                    if let Some((d, open_sp, close_sp)) = self.suspicious_open_spans.iter()
+                        .filter(|(d, _, _)| delim == d)
+                        .next()  // these are in reverse order as they get inserted on close, but
+                    {            // we want the last open/first close
+                        if d == delim {
+                            err.span_label(*open_sp, "this might be the culprit...");
+                            err.span_label(
+                                *close_sp,
+                                "...as it matches this but it has different indentation",
+                            );
+                        }
+                    }
+                }
                 Err(err)
             },
             token::OpenDelim(delim) => {
@@ -70,11 +84,20 @@ impl<'a> StringReader<'a> {
                 // Expand to cover the entire delimited token tree
                 let span = pre_span.with_hi(self.span.hi());
 
+                let sm = self.sess.source_map();
                 match self.token {
                     // Correct delimiter.
                     token::CloseDelim(d) if d == delim => {
-                        self.open_braces.pop().unwrap();
-
+                        let (open_brace, open_brace_span) = self.open_braces.pop().unwrap();
+                        if let Some(current_padding) = sm.span_to_margin(self.span) {
+                            if let Some(padding) = sm.span_to_margin(open_brace_span) {
+                                if current_padding != padding {
+                                    self.suspicious_open_spans.push(
+                                        (open_brace, open_brace_span, self.span),
+                                    );
+                                }
+                            }
+                        }
                         // Parse the close delimiter.
                         self.real_token();
                     }
@@ -96,6 +119,19 @@ impl<'a> StringReader<'a> {
                             if let Some(&(_, sp)) = self.open_braces.last() {
                                 err.span_label(sp, "un-closed delimiter");
                             };
+                            if let Some(current_padding) = sm.span_to_margin(self.span) {
+                                for (brace, brace_span) in &self.open_braces {
+                                    if let Some(padding) = sm.span_to_margin(*brace_span) {
+                                        // high likelihood of these two corresponding
+                                        if current_padding == padding && brace == &other {
+                                            err.span_label(
+                                                *brace_span,
+                                                "close delimiter possibly meant for this",
+                                            );
+                                        }
+                                    }
+                                }
+                            }
                             err.emit();
                         }
                         self.open_braces.pop().unwrap();
diff --git a/src/libsyntax/source_map.rs b/src/libsyntax/source_map.rs
index 8f91db8efa71a..a33090ff41b7a 100644
--- a/src/libsyntax/source_map.rs
+++ b/src/libsyntax/source_map.rs
@@ -251,17 +251,18 @@ impl SourceMap {
     /// crate. The source code of such an "imported source_file" is not available,
     /// but we still know enough to generate accurate debuginfo location
     /// information for things inlined from other crates.
-    pub fn new_imported_source_file(&self,
-                                filename: FileName,
-                                name_was_remapped: bool,
-                                crate_of_origin: u32,
-                                src_hash: u128,
-                                name_hash: u128,
-                                source_len: usize,
-                                mut file_local_lines: Vec<BytePos>,
-                                mut file_local_multibyte_chars: Vec<MultiByteChar>,
-                                mut file_local_non_narrow_chars: Vec<NonNarrowChar>)
-                                -> Lrc<SourceFile> {
+    pub fn new_imported_source_file(
+        &self,
+        filename: FileName,
+        name_was_remapped: bool,
+        crate_of_origin: u32,
+        src_hash: u128,
+        name_hash: u128,
+        source_len: usize,
+        mut file_local_lines: Vec<BytePos>,
+        mut file_local_multibyte_chars: Vec<MultiByteChar>,
+        mut file_local_non_narrow_chars: Vec<NonNarrowChar>,
+    ) -> Lrc<SourceFile> {
         let start_pos = self.next_start_pos();
 
         let end_pos = Pos::from_usize(start_pos + source_len);
@@ -578,6 +579,15 @@ impl SourceMap {
                                                                 .to_string())
     }
 
+    pub fn span_to_margin(&self, sp: Span) -> Option<usize> {
+        match self.span_to_prev_source(sp) {
+            Err(_) => None,
+            Ok(source) => source.split('\n').last().map(|last_line| {
+                last_line.len() - last_line.trim_left().len()
+            })
+        }
+    }
+
     /// Return the source snippet as `String` before the given `Span`
     pub fn span_to_prev_source(&self, sp: Span) -> Result<String, SpanSnippetError> {
         self.span_to_source(sp, |src, start_index, _| src[..start_index].to_string())
diff --git a/src/test/ui/parser-recovery-1.stderr b/src/test/ui/parser-recovery-1.stderr
index 7d2f80148de33..d0247b86ac372 100644
--- a/src/test/ui/parser-recovery-1.stderr
+++ b/src/test/ui/parser-recovery-1.stderr
@@ -3,6 +3,11 @@ error: this file contains an un-closed delimiter
    |
 LL | trait Foo {
    |           - un-closed delimiter
+LL |     fn bar() {
+   |              - this might be the culprit...
+...
+LL | }
+   | - ...as it matches this but it has different indentation
 ...
 LL | } //~ ERROR this file contains an un-closed delimiter
    |                                                       ^
diff --git a/src/test/ui/parser/unclosed-braces.rs b/src/test/ui/parser/unclosed-braces.rs
new file mode 100644
index 0000000000000..640894475846e
--- /dev/null
+++ b/src/test/ui/parser/unclosed-braces.rs
@@ -0,0 +1,32 @@
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+struct S {
+    x: [usize; 3],
+}
+
+fn foo() {
+    {
+        {
+            println!("hi");
+        }
+    }
+}
+
+fn main() {
+//~^ NOTE un-closed delimiter
+    {
+        {
+        //~^ NOTE this might be the culprit...
+            foo();
+    }
+    //~^ NOTE ...as it matches this but it has different indentation
+}
+//~ ERROR this file contains an un-closed delimiter
diff --git a/src/test/ui/parser/unclosed-braces.stderr b/src/test/ui/parser/unclosed-braces.stderr
new file mode 100644
index 0000000000000..5d5ff24faa6dd
--- /dev/null
+++ b/src/test/ui/parser/unclosed-braces.stderr
@@ -0,0 +1,17 @@
+error: this file contains an un-closed delimiter
+  --> $DIR/unclosed-braces.rs:32:53
+   |
+LL | fn main() {
+   |           - un-closed delimiter
+...
+LL |         {
+   |         - this might be the culprit...
+...
+LL |     }
+   |     - ...as it matches this but it has different indentation
+...
+LL | //~ ERROR this file contains an un-closed delimiter
+   |                                                     ^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/resolve/token-error-correct-3.stderr b/src/test/ui/resolve/token-error-correct-3.stderr
index b6946f62388a7..b87a59d219655 100644
--- a/src/test/ui/resolve/token-error-correct-3.stderr
+++ b/src/test/ui/resolve/token-error-correct-3.stderr
@@ -1,6 +1,8 @@
 error: incorrect close delimiter: `}`
   --> $DIR/token-error-correct-3.rs:30:9
    |
+LL |         if !is_directory(path.as_ref()) { //~ ERROR: cannot find function `is_directory`
+   |                                         - close delimiter possibly meant for this
 LL |             callback(path.as_ref(); //~ ERROR expected one of
    |                     - un-closed delimiter
 ...
diff --git a/src/test/ui/resolve/token-error-correct.stderr b/src/test/ui/resolve/token-error-correct.stderr
index 7081a5976294d..b69098407323a 100644
--- a/src/test/ui/resolve/token-error-correct.stderr
+++ b/src/test/ui/resolve/token-error-correct.stderr
@@ -1,6 +1,8 @@
 error: incorrect close delimiter: `}`
   --> $DIR/token-error-correct.rs:16:1
    |
+LL | fn main() {
+   |           - close delimiter possibly meant for this
 LL |     foo(bar(;
    |            - un-closed delimiter
 LL |     //~^ ERROR: expected expression, found `;`
diff --git a/src/test/ui/token/issue-10636-2.stderr b/src/test/ui/token/issue-10636-2.stderr
index 10dc5f655698e..9800b0c5e3f05 100644
--- a/src/test/ui/token/issue-10636-2.stderr
+++ b/src/test/ui/token/issue-10636-2.stderr
@@ -1,6 +1,8 @@
 error: incorrect close delimiter: `}`
   --> $DIR/issue-10636-2.rs:18:1
    |
+LL | pub fn trace_option(option: Option<isize>) {
+   |                                            - close delimiter possibly meant for this
 LL |     option.map(|some| 42;
    |               - un-closed delimiter
 ...

From b2d2d837235d0b06e56bb3191aff7ae358ac6018 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Esteban=20K=C3=BCber?= <esteban@kuber.com.ar>
Date: Wed, 5 Sep 2018 07:03:02 -0700
Subject: [PATCH 3/4] Fix existing test

---
 src/test/{parse-fail => ui}/issue-2354.rs |  4 +++-
 src/test/ui/issue-2354.stderr             | 16 ++++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)
 rename src/test/{parse-fail => ui}/issue-2354.rs (82%)
 create mode 100644 src/test/ui/issue-2354.stderr

diff --git a/src/test/parse-fail/issue-2354.rs b/src/test/ui/issue-2354.rs
similarity index 82%
rename from src/test/parse-fail/issue-2354.rs
rename to src/test/ui/issue-2354.rs
index 2e799a72c81af..418f30df22bf7 100644
--- a/src/test/parse-fail/issue-2354.rs
+++ b/src/test/ui/issue-2354.rs
@@ -10,11 +10,13 @@
 
 // compile-flags: -Z parse-only
 
-fn foo() { //~ HELP did you mean to close this delimiter?
+fn foo() { //~ NOTE un-closed delimiter
   match Some(x) {
+  //~^ NOTE this might be the culprit...
       Some(y) => { panic!(); }
       None => { panic!(); }
 }
+//~^ NOTE ...as it matches this but it has different indentation
 
 fn bar() {
     let mut i = 0;
diff --git a/src/test/ui/issue-2354.stderr b/src/test/ui/issue-2354.stderr
new file mode 100644
index 0000000000000..720f37da9d389
--- /dev/null
+++ b/src/test/ui/issue-2354.stderr
@@ -0,0 +1,16 @@
+error: this file contains an un-closed delimiter
+  --> $DIR/issue-2354.rs:26:66
+   |
+LL | fn foo() { //~ NOTE un-closed delimiter
+   |          - un-closed delimiter
+LL |   match Some(x) {
+   |                 - this might be the culprit...
+...
+LL | }
+   | - ...as it matches this but it has different indentation
+...
+LL | fn main() {} //~ ERROR this file contains an un-closed delimiter
+   |                                                                  ^
+
+error: aborting due to previous error
+

From 3192d3dc0c4417a6e360018b341c07d32f3f3d7f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Esteban=20K=C3=BCber?= <esteban@kuber.com.ar>
Date: Wed, 5 Sep 2018 07:33:29 -0700
Subject: [PATCH 4/4] Change wording of unclosed delimiter label

---
 src/libsyntax/parse/lexer/tokentrees.rs   | 5 ++++-
 src/test/ui/issue-2354.rs                 | 2 +-
 src/test/ui/issue-2354.stderr             | 2 +-
 src/test/ui/parser-recovery-1.stderr      | 2 +-
 src/test/ui/parser/unclosed-braces.rs     | 2 +-
 src/test/ui/parser/unclosed-braces.stderr | 2 +-
 6 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/src/libsyntax/parse/lexer/tokentrees.rs b/src/libsyntax/parse/lexer/tokentrees.rs
index 2999e65ae4aea..e6ad3b9203ea7 100644
--- a/src/libsyntax/parse/lexer/tokentrees.rs
+++ b/src/libsyntax/parse/lexer/tokentrees.rs
@@ -58,7 +58,10 @@ impl<'a> StringReader<'a> {
                         .next()  // these are in reverse order as they get inserted on close, but
                     {            // we want the last open/first close
                         if d == delim {
-                            err.span_label(*open_sp, "this might be the culprit...");
+                            err.span_label(
+                                *open_sp,
+                                "this delimiter might not be properly closed...",
+                            );
                             err.span_label(
                                 *close_sp,
                                 "...as it matches this but it has different indentation",
diff --git a/src/test/ui/issue-2354.rs b/src/test/ui/issue-2354.rs
index 418f30df22bf7..35fddcb0de442 100644
--- a/src/test/ui/issue-2354.rs
+++ b/src/test/ui/issue-2354.rs
@@ -12,7 +12,7 @@
 
 fn foo() { //~ NOTE un-closed delimiter
   match Some(x) {
-  //~^ NOTE this might be the culprit...
+  //~^ NOTE this delimiter might not be properly closed...
       Some(y) => { panic!(); }
       None => { panic!(); }
 }
diff --git a/src/test/ui/issue-2354.stderr b/src/test/ui/issue-2354.stderr
index 720f37da9d389..9cf569b685b11 100644
--- a/src/test/ui/issue-2354.stderr
+++ b/src/test/ui/issue-2354.stderr
@@ -4,7 +4,7 @@ error: this file contains an un-closed delimiter
 LL | fn foo() { //~ NOTE un-closed delimiter
    |          - un-closed delimiter
 LL |   match Some(x) {
-   |                 - this might be the culprit...
+   |                 - this delimiter might not be properly closed...
 ...
 LL | }
    | - ...as it matches this but it has different indentation
diff --git a/src/test/ui/parser-recovery-1.stderr b/src/test/ui/parser-recovery-1.stderr
index d0247b86ac372..5ba96e1a5dd8f 100644
--- a/src/test/ui/parser-recovery-1.stderr
+++ b/src/test/ui/parser-recovery-1.stderr
@@ -4,7 +4,7 @@ error: this file contains an un-closed delimiter
 LL | trait Foo {
    |           - un-closed delimiter
 LL |     fn bar() {
-   |              - this might be the culprit...
+   |              - this delimiter might not be properly closed...
 ...
 LL | }
    | - ...as it matches this but it has different indentation
diff --git a/src/test/ui/parser/unclosed-braces.rs b/src/test/ui/parser/unclosed-braces.rs
index 640894475846e..802133ae6b98b 100644
--- a/src/test/ui/parser/unclosed-braces.rs
+++ b/src/test/ui/parser/unclosed-braces.rs
@@ -24,7 +24,7 @@ fn main() {
 //~^ NOTE un-closed delimiter
     {
         {
-        //~^ NOTE this might be the culprit...
+        //~^ NOTE this delimiter might not be properly closed...
             foo();
     }
     //~^ NOTE ...as it matches this but it has different indentation
diff --git a/src/test/ui/parser/unclosed-braces.stderr b/src/test/ui/parser/unclosed-braces.stderr
index 5d5ff24faa6dd..4f865bc9b39cb 100644
--- a/src/test/ui/parser/unclosed-braces.stderr
+++ b/src/test/ui/parser/unclosed-braces.stderr
@@ -5,7 +5,7 @@ LL | fn main() {
    |           - un-closed delimiter
 ...
 LL |         {
-   |         - this might be the culprit...
+   |         - this delimiter might not be properly closed...
 ...
 LL |     }
    |     - ...as it matches this but it has different indentation