From 5238b523c3959e33add469af77b2ffa5a60b4cf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= 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?= 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, last_unclosed_found_span: Option, } @@ -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, - mut file_local_multibyte_chars: Vec, - mut file_local_non_narrow_chars: Vec) - -> Lrc { + 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, + mut file_local_multibyte_chars: Vec, + mut file_local_non_narrow_chars: Vec, + ) -> Lrc { 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 { + 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 { 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 or the MIT license +// , 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) { + | - 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?= 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?= 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