Skip to content

Commit 0c098ca

Browse files
committed
[Lexer] Remove spurious unexpected delimiter error by matching remaining open_braces
Signed-off-by: xizheyin <[email protected]>
1 parent 66678e6 commit 0c098ca

23 files changed

+87
-85
lines changed

compiler/rustc_parse/src/lexer/tokentrees.rs

+12-5
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
3535
return if is_delimited {
3636
Ok((open_spacing, TokenStream::new(buf)))
3737
} else {
38-
Err(vec![self.close_delim_err(delim)])
38+
Err(self.close_delim_err(delim))
3939
};
4040
}
4141
token::Eof => {
@@ -157,15 +157,15 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
157157
candidate = Some(*brace_span);
158158
}
159159
}
160-
let (_, _) = self.diag_info.open_braces.pop().unwrap();
160+
//let (_, _) = self.diag_info.open_braces.pop().unwrap();
161161
self.diag_info.unmatched_delims.push(UnmatchedDelim {
162162
found_delim: Some(close_delim),
163163
found_span: self.token.span,
164164
unclosed_span: unclosed_delimiter,
165165
candidate_span: candidate,
166166
});
167167
} else {
168-
self.diag_info.open_braces.pop();
168+
//self.diag_info.open_braces.pop();
169169
}
170170

171171
// If the incorrect delimiter matches an earlier opening
@@ -242,14 +242,21 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
242242
this_spacing
243243
}
244244

245-
fn close_delim_err(&mut self, delim: Delimiter) -> Diag<'psess> {
245+
fn close_delim_err(&mut self, delim: Delimiter) -> Vec<Diag<'psess>> {
246246
// An unexpected closing delimiter (i.e., there is no matching opening delimiter).
247+
//println!("open_braces: {:?}", self.diag_info.open_braces);
248+
if let Some((last_open_braces, _)) = self.diag_info.open_braces.last()
249+
&& *last_open_braces == delim
250+
{
251+
self.diag_info.open_braces.pop();
252+
return vec![];
253+
}
247254
let token_str = token_to_string(&self.token);
248255
let msg = format!("unexpected closing delimiter: `{token_str}`");
249256
let mut err = self.dcx().struct_span_err(self.token.span, msg);
250257

251258
report_suspicious_mismatch_block(&mut err, &self.diag_info, self.psess.source_map(), delim);
252259
err.span_label(self.token.span, "unexpected closing delimiter");
253-
err
260+
vec![err]
254261
}
255262
}

tests/ui/parser/deli-ident-issue-2.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ fn main() {
22
if 1 < 2 {
33
let _a = vec!]; //~ ERROR mismatched closing delimiter
44
}
5-
} //~ ERROR unexpected closing delimiter
5+
}
66

77
fn main() {}

tests/ui/parser/deli-ident-issue-2.stderr

+1-10
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,5 @@ LL | if 1 < 2 {
66
LL | let _a = vec!];
77
| ^ mismatched closing delimiter
88

9-
error: unexpected closing delimiter: `}`
10-
--> $DIR/deli-ident-issue-2.rs:5:1
11-
|
12-
LL | let _a = vec!];
13-
| - missing open `[` for this delimiter
14-
LL | }
15-
LL | }
16-
| ^ unexpected closing delimiter
17-
18-
error: aborting due to 2 previous errors
9+
error: aborting due to 1 previous error
1910

tests/ui/parser/issues/issue-104367.stderr

+3-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ LL | d: [u32; {
1818
LL | #![cfg] {
1919
| - unclosed delimiter
2020
LL | #![w,)
21-
| - missing open `(` for this delimiter
21+
| - - missing open `(` for this delimiter
22+
| |
23+
| unclosed delimiter
2224
LL |
2325
| ^
2426

tests/ui/parser/issues/issue-105209.stderr

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ error: this file contains an unclosed delimiter
1010
--> $DIR/issue-105209.rs:3:68
1111
|
1212
LL | #![c={#![c[)x
13-
| - - - - missing open `(` for this delimiter
14-
| | | |
13+
| - - - -- missing open `(` for this delimiter
14+
| | | | |
15+
| | | | unclosed delimiter
1516
| | | unclosed delimiter
1617
| | unclosed delimiter
1718
| unclosed delimiter

tests/ui/parser/issues/issue-62895.stderr

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ LL | (), w20);
88
| ^ mismatched closing delimiter
99

1010
error: mismatched closing delimiter: `)`
11-
--> $DIR/issue-62895.rs:4:7
11+
--> $DIR/issue-62895.rs:5:22
1212
|
13-
LL | mod _ {
14-
| ^ unclosed delimiter
13+
LL | pub fn g() -> isizee {
14+
| ^ unclosed delimiter
1515
...
1616
LL | (), w20);
1717
| ^ mismatched closing delimiter

tests/ui/parser/issues/issue-62973.stderr

+5-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ error: this file contains an unclosed delimiter
1818
--> $DIR/issue-62973.rs:8:2
1919
|
2020
LL | fn p() { match s { v, E { [) {) }
21-
| - - - - missing open `(` for this delimiter
22-
| | | |
23-
| | | missing open `(` for this delimiter
21+
| - - - -- - missing open `(` for this delimiter
22+
| | | | ||
23+
| | | | |missing open `(` for this delimiter
24+
| | | | unclosed delimiter
25+
| | | unclosed delimiter
2426
| | unclosed delimiter
2527
| unclosed delimiter
2628
LL |

tests/ui/parser/issues/issue-63116.stderr

+4-3
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ error: this file contains an unclosed delimiter
1010
--> $DIR/issue-63116.rs:3:18
1111
|
1212
LL | impl W <s(f;Y(;]
13-
| - -^
14-
| | |
15-
| | missing open `[` for this delimiter
13+
| - - -^
14+
| | | |
15+
| | | missing open `[` for this delimiter
16+
| | unclosed delimiter
1617
| unclosed delimiter
1718

1819
error: aborting due to 2 previous errors

tests/ui/parser/issues/issue-67377-invalid-syntax-in-enum-discriminant.stderr

+7
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,22 @@ LL | V = [Vec::new; { [0].len() ].len() as isize,
2828
error: this file contains an unclosed delimiter
2929
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:23:65
3030
|
31+
LL | mod a {
32+
| - unclosed delimiter
33+
...
3134
LL | V = [PhantomData; { [ () ].len() ].len() as isize,
3235
| - missing open `[` for this delimiter
3336
...
37+
LL | mod b {
38+
| - unclosed delimiter
39+
LL | enum Bug {
3440
LL | V = [Vec::new; { [].len() ].len() as isize,
3541
| - missing open `[` for this delimiter
3642
...
3743
LL | mod c {
3844
| - unclosed delimiter
3945
LL | enum Bug {
46+
| - unclosed delimiter
4047
LL | V = [Vec::new; { [0].len() ].len() as isize,
4148
| - missing open `[` for this delimiter
4249
...

tests/ui/parser/issues/issue-68987-unmatch-issue-2.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ async fn obstest() -> Result<> {
1111
} else {
1212

1313
}
14-
} //~ ERROR unexpected closing delimiter
14+
}

tests/ui/parser/issues/issue-68987-unmatch-issue-2.stderr

+1-10
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,5 @@ LL | async fn obstest() -> Result<> {
66
LL | let obs_connect = || -> Result<(), MyError) {
77
| ^ mismatched closing delimiter
88

9-
error: unexpected closing delimiter: `}`
10-
--> $DIR/issue-68987-unmatch-issue-2.rs:14:1
11-
|
12-
LL | let obs_connect = || -> Result<(), MyError) {
13-
| - missing open `(` for this delimiter
14-
...
15-
LL | }
16-
| ^ unexpected closing delimiter
17-
18-
error: aborting due to 2 previous errors
9+
error: aborting due to 1 previous error
1910

tests/ui/parser/issues/issue-68987-unmatch-issue-3.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ fn f(i: u32, j: u32) {
55
while cnt < j {
66
write!&mut res, " "); //~ ERROR mismatched closing delimiter
77
}
8-
} //~ ERROR unexpected closing delimiter
8+
}

tests/ui/parser/issues/issue-68987-unmatch-issue-3.stderr

+1-10
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,5 @@ LL | while cnt < j {
66
LL | write!&mut res, " ");
77
| ^ mismatched closing delimiter
88

9-
error: unexpected closing delimiter: `}`
10-
--> $DIR/issue-68987-unmatch-issue-3.rs:8:1
11-
|
12-
LL | write!&mut res, " ");
13-
| - missing open `(` for this delimiter
14-
LL | }
15-
LL | }
16-
| ^ unexpected closing delimiter
17-
18-
error: aborting due to 2 previous errors
9+
error: aborting due to 1 previous error
1910

tests/ui/parser/issues/issue-81804.stderr

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ error: this file contains an unclosed delimiter
1010
--> $DIR/issue-81804.rs:6:11
1111
|
1212
LL | fn p([=(}
13-
| -- ^
14-
| ||
13+
| -- - ^
14+
| || |
15+
| || unclosed delimiter
1516
| |unclosed delimiter
1617
| unclosed delimiter
1718

tests/ui/parser/issues/issue-81827.stderr

+6-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ error: this file contains an unclosed delimiter
1111
--> $DIR/issue-81827.rs:10:27
1212
|
1313
LL | fn r()->i{0|{#[cfg(r(0{]0
14-
| - - - ^
15-
| | | |
16-
| | | missing open `[` for this delimiter
14+
| - - - - - - ^
15+
| | | | | | |
16+
| | | | | | missing open `[` for this delimiter
17+
| | | | | unclosed delimiter
18+
| | | | unclosed delimiter
19+
| | | unclosed delimiter
1720
| | unclosed delimiter
1821
| unclosed delimiter
1922

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
pub fn foo(x: i64) -> i64 {
2+
x.abs) //~ ERROR mismatched closing delimiter
3+
}
4+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
error: mismatched closing delimiter: `)`
2+
--> $DIR/unnessary-error-issue-138401.rs:1:27
3+
|
4+
LL | pub fn foo(x: i64) -> i64 {
5+
| ^ unclosed delimiter
6+
LL | x.abs)
7+
| ^ mismatched closing delimiter
8+
9+
error: aborting due to 1 previous error
10+

tests/ui/parser/macro-mismatched-delim-paren-brace.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ fn main() {
22
foo! (
33
bar, "baz", 1, 2.0
44
} //~ ERROR mismatched closing delimiter
5-
} //~ ERROR unexpected closing delimiter: `}`
5+
}

tests/ui/parser/macro-mismatched-delim-paren-brace.stderr

+1-12
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,5 @@ LL | bar, "baz", 1, 2.0
77
LL | }
88
| ^ mismatched closing delimiter
99

10-
error: unexpected closing delimiter: `}`
11-
--> $DIR/macro-mismatched-delim-paren-brace.rs:5:1
12-
|
13-
LL | fn main() {
14-
| - this delimiter might not be properly closed...
15-
...
16-
LL | }
17-
| - ...as it matches this but it has different indentation
18-
LL | }
19-
| ^ unexpected closing delimiter
20-
21-
error: aborting due to 2 previous errors
10+
error: aborting due to 1 previous error
2211

tests/ui/parser/mismatched-delimiter-corner-case-issue-127868.stderr

+2-4
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,13 @@ error: this file contains an unclosed delimiter
1414
LL | fn main() {
1515
| - unclosed delimiter
1616
LL | let a = [[[[[[[[[[[[[[[[[[[[1, {, (, [,;
17-
| ----- - this delimiter might not be properly closed...
18-
| |||||
19-
| ||||another 16 unclosed delimiters begin from here
17+
| ----- another 18 unclosed delimiters begin from here
18+
| ||||
2019
| |||unclosed delimiter
2120
| ||unclosed delimiter
2221
| |unclosed delimiter
2322
| unclosed delimiter
2423
LL | }
25-
| - ...as it matches this but it has different indentation
2624
LL |
2725
| ^
2826

tests/ui/parser/parser-ice-ed2021-await-105210.stderr

+9-7
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,24 @@ LL | (( h (const {( default ( await ( await ( (move {await((((}}
88
| closing delimiter possibly meant for this
99

1010
error: mismatched closing delimiter: `}`
11-
--> $DIR/parser-ice-ed2021-await-105210.rs:7:43
11+
--> $DIR/parser-ice-ed2021-await-105210.rs:7:57
1212
|
1313
LL | (( h (const {( default ( await ( await ( (move {await((((}}
14-
| - ^ ^ mismatched closing delimiter
15-
| | |
16-
| | unclosed delimiter
17-
| closing delimiter possibly meant for this
14+
| - ^ ^ mismatched closing delimiter
15+
| | |
16+
| | unclosed delimiter
17+
| closing delimiter possibly meant for this
1818

1919
error: this file contains an unclosed delimiter
2020
--> $DIR/parser-ice-ed2021-await-105210.rs:10:52
2121
|
2222
LL | fn box () {
2323
| - unclosed delimiter
2424
LL | (( h (const {( default ( await ( await ( (move {await((((}}
25-
| -- - unclosed delimiter
26-
| ||
25+
| -- - -- another 8 unclosed delimiters begin from here
26+
| || | |
27+
| || | unclosed delimiter
28+
| || unclosed delimiter
2729
| |unclosed delimiter
2830
| unclosed delimiter
2931
...

tests/ui/suggestions/issue-94171.stderr

+4-3
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ error: this file contains an unclosed delimiter
2222
--> $DIR/issue-94171.rs:5:52
2323
|
2424
LL | fn L(]{match
25-
| -- unclosed delimiter
26-
| |
27-
| missing open `[` for this delimiter
25+
| --- unclosed delimiter
26+
| ||
27+
| |missing open `[` for this delimiter
28+
| unclosed delimiter
2829
LL | (; {`
2930
| - - unclosed delimiter
3031
| |

tests/ui/typeck/issue-91334.stderr

+4-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ error: this file contains an unclosed delimiter
1111
--> $DIR/issue-91334.rs:7:23
1212
|
1313
LL | fn f(){||yield(((){),
14-
| - - - ^
15-
| | | |
16-
| | | missing open `(` for this delimiter
14+
| - -- - ^
15+
| | || |
16+
| | || missing open `(` for this delimiter
17+
| | |unclosed delimiter
1718
| | unclosed delimiter
1819
| unclosed delimiter
1920

0 commit comments

Comments
 (0)