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

Lines changed: 12 additions & 5 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 10 deletions
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

Lines changed: 3 additions & 1 deletion
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

Lines changed: 3 additions & 2 deletions
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

Lines changed: 3 additions & 3 deletions
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

Lines changed: 5 additions & 3 deletions
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

Lines changed: 4 additions & 3 deletions
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

Lines changed: 7 additions & 0 deletions
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

Lines changed: 1 addition & 1 deletion
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+
}

0 commit comments

Comments
 (0)