From 83c0934c3b262e4e38083a408c6e09b9405e6676 Mon Sep 17 00:00:00 2001 From: yukang Date: Sat, 5 Nov 2022 23:25:07 +0800 Subject: [PATCH] Only use indentation to detect mismatch delimiter when the line starting with delimiter --- compiler/rustc_parse/src/lexer/tokentrees.rs | 7 +++-- src/test/ui/parser/deli-ident-issue-1.rs | 27 +++++++++++++++++ src/test/ui/parser/deli-ident-issue-1.stderr | 31 ++++++++++++++++++++ src/test/ui/parser/deli-ident-issue-2.rs | 25 ++++++++++++++++ src/test/ui/parser/deli-ident-issue-2.stderr | 31 ++++++++++++++++++++ src/test/ui/parser/issues/issue-2354.rs | 2 -- src/test/ui/parser/issues/issue-2354.stderr | 7 +---- src/test/ui/parser/parser-recovery-1.stderr | 5 ---- 8 files changed, 119 insertions(+), 16 deletions(-) create mode 100644 src/test/ui/parser/deli-ident-issue-1.rs create mode 100644 src/test/ui/parser/deli-ident-issue-1.stderr create mode 100644 src/test/ui/parser/deli-ident-issue-2.rs create mode 100644 src/test/ui/parser/deli-ident-issue-2.stderr diff --git a/compiler/rustc_parse/src/lexer/tokentrees.rs b/compiler/rustc_parse/src/lexer/tokentrees.rs index b2701817d489b..28e165b98e23b 100644 --- a/compiler/rustc_parse/src/lexer/tokentrees.rs +++ b/compiler/rustc_parse/src/lexer/tokentrees.rs @@ -107,11 +107,12 @@ impl<'a> TokenTreesReader<'a> { if let Some((_, open_sp, close_sp)) = self.matching_delim_spans.iter().find(|(d, open_sp, close_sp)| { let sm = self.string_reader.sess.source_map(); - if let Some(close_padding) = sm.span_to_margin(*close_sp) { - if let Some(open_padding) = sm.span_to_margin(*open_sp) { + if let Some(open_padding) = sm.span_to_margin(*open_sp) && + let Some(close_padding) = sm.span_to_margin(*close_sp) && + sm.is_line_before_span_empty(*open_sp) && + sm.is_line_before_span_empty(*close_sp) { return delim == d && close_padding != open_padding; } - } false }) // these are in reverse order as they get inserted on close, but diff --git a/src/test/ui/parser/deli-ident-issue-1.rs b/src/test/ui/parser/deli-ident-issue-1.rs new file mode 100644 index 0000000000000..73a69382bb86c --- /dev/null +++ b/src/test/ui/parser/deli-ident-issue-1.rs @@ -0,0 +1,27 @@ +// ignore-tidy-trailing-newlines +// +// error-pattern: this file contains an unclosed delimiter +#![feature(let_chains)] +trait Demo {} + +impl dyn Demo { + pub fn report(&self) -> u32 { + let sum = |a: u32, + b: u32, + c: u32| { + a + b + c + }; + sum(1, 2, 3) + } + + fn check(&self, val: Option, num: Option) { + if let Some(b) = val + && let Some(c) = num { + && b == c { + //~^ ERROR expected struct + //~| ERROR mismatched types + } + } +} + +fn main() { } //~ ERROR this file contains an unclosed delimiter \ No newline at end of file diff --git a/src/test/ui/parser/deli-ident-issue-1.stderr b/src/test/ui/parser/deli-ident-issue-1.stderr new file mode 100644 index 0000000000000..ad6657700f8b8 --- /dev/null +++ b/src/test/ui/parser/deli-ident-issue-1.stderr @@ -0,0 +1,31 @@ +error: this file contains an unclosed delimiter + --> $DIR/deli-ident-issue-1.rs:27:65 + | +LL | impl dyn Demo { + | - unclosed delimiter +... +LL | fn main() { } + | ^ + +error[E0574]: expected struct, variant or union type, found local variable `c` + --> $DIR/deli-ident-issue-1.rs:20:17 + | +LL | && b == c { + | ^ not a struct, variant or union type + +error[E0308]: mismatched types + --> $DIR/deli-ident-issue-1.rs:20:9 + | +LL | fn check(&self, val: Option, num: Option) { + | - expected `()` because of default return type +... +LL | / && b == c { +LL | | +LL | | +LL | | } + | |_________^ expected `()`, found `bool` + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0308, E0574. +For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/parser/deli-ident-issue-2.rs b/src/test/ui/parser/deli-ident-issue-2.rs new file mode 100644 index 0000000000000..ba3c4c5c8af78 --- /dev/null +++ b/src/test/ui/parser/deli-ident-issue-2.rs @@ -0,0 +1,25 @@ +// ignore-tidy-trailing-newlines +// +// error-pattern: this file contains an unclosed delimiter +#![feature(let_chains)] +trait Demo {} + +impl dyn Demo { + pub fn report(&self, + a: u32, + b: u32, + c: u32) -> u32 { + return a + b + c; + } + + fn check(&self, val: Option, num: Option) { + if let Some(b) = val + && let Some(c) = num { + && b == c { + //~^ ERROR expected struct + //~| ERROR mismatched types + } + } +} + +fn main() { } //~ ERROR this file contains an unclosed delimiter \ No newline at end of file diff --git a/src/test/ui/parser/deli-ident-issue-2.stderr b/src/test/ui/parser/deli-ident-issue-2.stderr new file mode 100644 index 0000000000000..b89538202b858 --- /dev/null +++ b/src/test/ui/parser/deli-ident-issue-2.stderr @@ -0,0 +1,31 @@ +error: this file contains an unclosed delimiter + --> $DIR/deli-ident-issue-2.rs:25:65 + | +LL | impl dyn Demo { + | - unclosed delimiter +... +LL | fn main() { } + | ^ + +error[E0574]: expected struct, variant or union type, found local variable `c` + --> $DIR/deli-ident-issue-2.rs:18:17 + | +LL | && b == c { + | ^ not a struct, variant or union type + +error[E0308]: mismatched types + --> $DIR/deli-ident-issue-2.rs:18:9 + | +LL | fn check(&self, val: Option, num: Option) { + | - expected `()` because of default return type +... +LL | / && b == c { +LL | | +LL | | +LL | | } + | |_________^ expected `()`, found `bool` + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0308, E0574. +For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/parser/issues/issue-2354.rs b/src/test/ui/parser/issues/issue-2354.rs index c422040cbe300..77b92c1f2cfb6 100644 --- a/src/test/ui/parser/issues/issue-2354.rs +++ b/src/test/ui/parser/issues/issue-2354.rs @@ -1,10 +1,8 @@ fn foo() { //~ NOTE unclosed delimiter match Some(10) { - //~^ NOTE this delimiter might not be properly closed... 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/parser/issues/issue-2354.stderr b/src/test/ui/parser/issues/issue-2354.stderr index b89ed3958357d..8c03b2a844391 100644 --- a/src/test/ui/parser/issues/issue-2354.stderr +++ b/src/test/ui/parser/issues/issue-2354.stderr @@ -1,13 +1,8 @@ error: this file contains an unclosed delimiter - --> $DIR/issue-2354.rs:15:52 + --> $DIR/issue-2354.rs:13:52 | LL | fn foo() { | - unclosed delimiter -LL | match Some(10) { - | - this delimiter might not be properly closed... -... -LL | } - | - ...as it matches this but it has different indentation ... LL | | ^ diff --git a/src/test/ui/parser/parser-recovery-1.stderr b/src/test/ui/parser/parser-recovery-1.stderr index 0cb771ea39c6d..20a566b15fc40 100644 --- a/src/test/ui/parser/parser-recovery-1.stderr +++ b/src/test/ui/parser/parser-recovery-1.stderr @@ -3,11 +3,6 @@ error: this file contains an unclosed delimiter | LL | trait Foo { | - unclosed delimiter -LL | fn bar() { - | - this delimiter might not be properly closed... -... -LL | } - | - ...as it matches this but it has different indentation ... LL | } | ^